Identity – Permission Claims & UserClaimsPrincipalFactory
amp Permission identity
2023-09-27 14:23:55 时间
前言
在 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")) { } }
相关文章
- C.8 基于ERNIELayout&PDFplumber-UIEX的多方案学术论文信息抽取
- 【dotnet跨平台】"dotnet restore"和"dotnet run"都做了些什么?
- jni 入门 android的C编程之旅 --->环境搭建&&helloworld
- day11<Java开发工具&常见对象>
- java -cp & java jar的区别
- (string&C++)(三、查找)find的使用
- NEFU 9.23 && 9.24
- PHP serialize && unserialize Security Risk Research
- Why Did the Cow Cross the Road II G & Why Did the Cow Cross the Road II P
- 浮点数问题详解,printf(“%dn“, 8.0); 为什么输出 0 ?——小端存储 & 浮点数格式 & 格式化输出 | bitset的使用 与 二进制原码分析
- java按位运算符(&、|、~、^) 移位操作符(>> >> )
- 【杂谈】写给正在过"程序员节"的我们
- 我的Android进阶之旅------>Android使用百度地图时,关于android.permission.BAIDU_LOCATION_SERVICE的声明警告。
- 我的Android进阶之旅------>如何将Android源码导入Eclipse中来查看(非常实用)
- Java语言实现简单FTP软件------>FTP软件效果图预览之下载功能(二)