前言
在 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")) { } }