in.net核心身份3-默认情况下,是否可以在身份cookie中存储用户索赔或角色主张,但仅将它们仅在数据库中?
换句话说,如果要访问索赔,则必须明确加载它们。
无法使用身份和默认架构的内置功能来弄清楚如何配置它。
我仍然能够使用aspnetroleclaims表中的内置,但通过覆盖UserClaimsprincipalFactory类而不将它们包括在cookie中。再次,原因是我有很多角色主张,而饼干变得太大了。
我创建了自己的类,appclaimssprincipalfactory,它从userclaimsprincipalfactory继承并覆盖createSync方法:
public class AppClaimsPrincipalFactory : UserClaimsPrincipalFactory<ApplicationUser, IdentityRole>
{
public AppClaimsPrincipalFactory(UserManager<ApplicationUser> userManager, RoleManager<IdentityRole> roleManager, IOptions<IdentityOptions> optionsAccessor) : base(userManager, roleManager, optionsAccessor)
{
}
public override async Task<ClaimsPrincipal> CreateAsync(ApplicationUser user)
{
if (user == null)
{
throw new ArgumentNullException(nameof(user));
}
var userId = await UserManager.GetUserIdAsync(user);
var userName = await UserManager.GetUserNameAsync(user);
var id = new ClaimsIdentity(Options.Cookies.ApplicationCookieAuthenticationScheme,
Options.ClaimsIdentity.UserNameClaimType,
Options.ClaimsIdentity.RoleClaimType);
id.AddClaim(new Claim(Options.ClaimsIdentity.UserIdClaimType, userId));
id.AddClaim(new Claim(Options.ClaimsIdentity.UserNameClaimType, userName));
if (UserManager.SupportsUserSecurityStamp)
{
id.AddClaim(new Claim(Options.ClaimsIdentity.SecurityStampClaimType,
await UserManager.GetSecurityStampAsync(user)));
}
// code removed that adds the role claims
if (UserManager.SupportsUserClaim)
{
id.AddClaims(await UserManager.GetClaimsAsync(user));
}
return new ClaimsPrincipal(id);
}
}
在startup.cs configerservices中,我然后将其注册为类似的容器:
services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
// override UserClaimsPrincipalFactory (to remove role claims from cookie )
services.AddScoped<IUserClaimsPrincipalFactory<ApplicationUser>, AppClaimsPrincipalFactory>();
另一个选项是不在UserStore实现上实现IuserClaimStore接口。作为EF软件包的一部分出现的默认实现确实实现了此接口,因此索赔是自动存储和检索的。