ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

.net6标识框架中的一些有用的概念记录

2022-06-21 11:31:26  阅读:225  来源: 互联网

标签:有用 标识 接口 ClaimTypes HasBirthDay 访问 授权 net6 Microsoft


引用自:【从0开始.NET CORE认证】-1 认识认证和授权 - 寂寞空庭春欲晚 - 博客园 (cnblogs.com)

 

 

 

 引入nuget包的作用:

 

  1. Microsoft.AspNetCore.Identity //包含AspNetCore.Identity的框架,我们可以使用里面认证授权等功能,最基础的功能
  2. Microsoft.AspNetCore.Identity.EntityFrameworkCore //对AspNetCore.Identity的扩展,让其可以和EF Core配合使用
  3. Microsoft.EntityFrameworkCore //EF Core 这个不用我多说了吧
  4. Microsoft.EntityFrameworkCore.SqlServer //EF Core用来连接sql server的包,如果使用mysql,最后一个换名字就行了
  5. 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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有