身份3-在数据库中存储索赔,而不是cookie



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软件包的一部分出现的默认实现确实实现了此接口,因此索赔是自动存储和检索的。

相关内容

  • 没有找到相关文章