In.net core Identity 3 - 默认情况下是否可以在Identity cookie中存储用户声明或角色声明,但仅将它们存储在数据库中?
换句话说,如果您想要访问声明,则必须明确加载它们。
无法使用Identity的内置功能和默认架构弄清楚如何配置它。
答案 0 :(得分:1)
我仍然能够使用内置的AspNetRoleClaims表,但不会通过覆盖UserClaimsPrincipalFactory类将其包含在cookie中。再一次,原因是我有很多角色声称,而且cookie变得太大了。
我创建了自己的类AppClaimsPrincipalFactory,它继承自UserClaimsPrincipalFactory并覆盖CreateAsync方法:
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 ConfigureServices中,我然后将其注册到容器中,如下所示:
services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
// override UserClaimsPrincipalFactory (to remove role claims from cookie )
services.AddScoped<IUserClaimsPrincipalFactory<ApplicationUser>, AppClaimsPrincipalFactory>();
答案 1 :(得分:0)
另一个选择是不在UserStore实现上实现IUserClaimStore接口。作为EF包的一部分的默认实现确实实现了此接口,因此自动存储和检索声明。