Identity – Permission Claims & UserClaimsPrincipalFactory

前言

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

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

Identity – Permission Claims & UserClaimsPrincipalFactory

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

 

Identity Role Claims

Identity role claims 的结构是这样的

Identity – Permission Claims & UserClaimsPrincipalFactory Identity – Permission Claims & UserClaimsPrincipalFactory

 

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 要怎么搞呢?

Identity – Permission Claims & UserClaimsPrincipalFactory

做多一个表记入授权的信息 (这只是一个 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"))
    {

    }
}

 

上一篇:Identity-Based Traitor Tracing


下一篇:利用云存储快速实现网站备份