其他分享
首页 > 其他分享> > Identity – Permission Claims & UserClaimsPrincipalFactory

Identity – Permission Claims & UserClaimsPrincipalFactory

作者:互联网

前言

在 Identity – Authorize 有介绍过, Identity 的验证核心是 Claims.

在 Identity – Without Identity Framework 也看到了 Claims 是怎样创建的.

这篇看看 Identity 如何帮助我们撞见 Claims 和我们要如何去扩展它.

 

Identity Role Claims

Identity role claims 的结构是这样的

 

 

User 有 claims, User 有 roles, Role 有 claims

所以最后 Principal 的 claims 就等于 user's claims + user 所以 role's claims

 

Custom Permission Claims

假设我们的需求是这样. Role 被授权 "Create Product", "Read Product", "Update Product", "Delete Product"

我们希望做一个 Permission Claims 要怎么搞呢?

做多一个表记入授权的信息 (这只是一个 example 不用纠结它业务的合理性哦)

然后实现一个 UserClaimsPrincipalFactory

Identity 会在创建 principal 的时候调用它. 

public class MyUserClaimsPrincipalFactory : UserClaimsPrincipalFactory<IdentityUser>
{
    public MyUserClaimsPrincipalFactory(UserManager<IdentityUser> userManager, IOptions<IdentityOptions> optionsAccessor) : base(userManager, optionsAccessor)
    {
    }

    protected override async Task<ClaimsIdentity> GenerateClaimsAsync(IdentityUser user)
    {
        var claims = await base.GenerateClaimsAsync(user);
        claims.AddClaim(new Claim ("MyClaim2", "MyClaim2Value"));
        return claims;
    }
}

然后在 Startup.cs 添加 service scoped 就可以了

builder.Services.AddScoped<IUserClaimsPrincipalFactory<IdentityUser>, MyUserClaimsPrincipalFactory>();

检查

public async Task OnGet()
{
    var claims = User.Claims.ToList();
    if (User.HasClaim(ClaimTypes.Role, "Super User")) // http://schemas.microsoft.com/ws/2008/06/identity/claims/role
    { 

    }
    if (User.HasClaim(c => c.Type == "MyClaim2"))
    {

    }
}

 

标签:Product,Role,User,claims,Claims,UserClaimsPrincipalFactory,Identity
来源: https://www.cnblogs.com/keatkeat/p/15831557.html