.net6标识框架中的一些有用的概念记录
作者:互联网
引用自:【从0开始.NET CORE认证】-1 认识认证和授权 - 寂寞空庭春欲晚 - 博客园 (cnblogs.com)
引入nuget包的作用:
- Microsoft.AspNetCore.Identity //包含AspNetCore.Identity的框架,我们可以使用里面认证授权等功能,最基础的功能
- Microsoft.AspNetCore.Identity.EntityFrameworkCore //对AspNetCore.Identity的扩展,让其可以和EF Core配合使用
- Microsoft.EntityFrameworkCore //EF Core 这个不用我多说了吧
- Microsoft.EntityFrameworkCore.SqlServer //EF Core用来连接sql server的包,如果使用mysql,最后一个换名字就行了
- Microsoft.EntityFrameworkCore.Tools //在VS 命令行里面迁移数据需要用的命令 add-migration update-database
修改或删除用户的Claim
我们添加一个可以修改用户的页面,将上次的Update.cshtml页面搬出来修改一下
1 <form formaction="/Home/ModifyUserClaim" method="post"> 2 <input name="username" value="@User.Claims.Where(i=>i.Type==ClaimTypes.Name).Select(p=>p.Value).FirstOrDefault()" /> 3 <button>确认修改</button> 4 </form>修改接口:
1 [HttpPost] 2 public async Task<IActionResult> ModifyUserClaim(string username) 3 { 4 var newclaim = new Claim(ClaimTypes.Name, "qqq"); 5 var user = await _userManager.FindByNameAsync(username); 6 await _signInManager.UserManager.ReplaceClaimAsync(user, User.Claims.Where(u=>u.Type==ClaimTypes.Name).First(), newclaim); 7 return View("Update"); 8 }删除接口
1 [HttpPost] 2 public async Task<IActionResult> RemoveUserClaim(string username) 3 { 4 var user = await _userManager.FindByNameAsync(username); 5 await _signInManager.UserManager.RemoveClaimAsync(user, User.Claims.Where(u => u.Type == ClaimTypes.Name).First()); 6 return View("Update"); 7 }他们分别调用了ReplaceClaimAsync和RemoveClaimAsync。其余操作没什么差异
基于策略的授权
这个应用场景非常多,日常生活中肯定会碰到多多少少需要权限访问接口的业务。例如:公司员工信息表中,有些员工填写了出生日期,有些没有,填写的人可以访问生日福利接口,没填写的人拒绝访问。又或者说:没填写的人,但是他的职位是总经理以上级别,就可以不需要填写出生日期就可以访问这个接口。等等诸如此类的权限控制。所以我们这么做
添加一个接口,和一个页面,加上Authorize(Policy ="HasBirthDay") 就是指定一个授权策略,这个授权策略名为HasBirthDay
然后添加页面
运行:很显然,会出错,提示没有找到一个名为HasBirthDay的授权策略。
我们在Startp.cs中加入这个授权策略
代码如下
1 services.AddAuthorization(config => { 2 var defaultPolicyBuilder = new AuthorizationPolicyBuilder(); 3 defaultPolicyBuilder.RequireClaim(ClaimTypes.DateOfBirth); 4 config.AddPolicy("HasBirthDay", defaultPolicyBuilder.Build()); 5 });再次运行试试看:因为我们当面登录的用户中没有给与DateOfBirth的Claims所以会被强制跳转到拒绝授权的页面。
我们给当前的用户加上DateOfBirth,试试看能不能访问,在Login出增加一行Claims
运行:可以看到,成功运行小提示:请先清空浏览器的Cookies,否则还是会被拒绝的。
基于角色的授权
在.net中,有一个非常方便的授权模式就是基于角色的授权,例如,普通用户不能访问,管理员能访问,老板能访问,员工不能访问。基于角色的授权其实就是基于策略的授权的演化,本身属于策略的一部分。稍微改动一下代码,把Policy换成了Role 值从HasBirthDay改成了Boss
运行试试看,很显然,我们又被拒绝了。
我们在登录的时候增加以下代码:
运行:可以看到,成功运行小提示:请先清空浏览器的Cookies,否则还是会被拒绝的。
标签:有用,标识,接口,ClaimTypes,HasBirthDay,访问,授权,net6,Microsoft 来源: https://www.cnblogs.com/zmy2020/p/16396233.html