ASP.NET Core 6.0 添加 JWT 认证和授权( 二 )

7 测试调用方式一:通过 Postman、Apifox 等接口调试软件调试
使用 Postman 调用 /api/Account/GetToken 生成 Token
在调用 /api/Account/GetTest 时传入 Token,得到返回结果
方式二:在浏览器控制台调试
调试 /api/Account/GetToken
var xhr = new XMLHttpRequest();xhr.addEventListener("readystatechange", function() {if(this.readyState === 4) {console.log(token = this.responseText); //这里用了一个全局变量 token,为下一个接口服务}});xhr.open("GET", "/api/Account/GetToken");xhr.send();调试 /api/Account/GetTest
var xhr = new XMLHttpRequest();xhr.addEventListener("readystatechange", function() {if(this.readyState === 4) {console.log(this.status, this.responseText); //this.status为响应状态码,401为无认证状态}});xhr.open("GET", "/api/Account/GetTest");xhr.setRequestHeader("Authorization",`Bearer ${token}`); //附带上 tokenxhr.send();
 
授权(Authorization)注意:授权必须基于认证,即:若没有完成上文关于认证的配置,则下面的授权是不会成功的 。
授权部分,将先介绍相关标签、授权方式,再介绍基于策略的授权 。这三部分大致的内容如下描述:
相关标签:Authorize 和 AllowAnonymous
授权方式:介绍 Policy、Role、Scheme 的基本内容
基于策略(Policy)的授权:深入 Policy 授权方式
相关标签(Attribute)授权相关标签具体请查考官方文档简单授权
[Authorize]
打上该标签的 Controller 或 Action 必须经过认证,且可以标识需要满足哪些授权规则 。
授权规则可以是 Policy(策略)、Roles(角色) 或 AuthenticationSchemes(方案) 。
[Authorize(Policy = "", Roles ="", AuthenticationSchemes ="")][AllowAnonymous]
允许匿名访问,级别高于 [Authorize],若两者同时作用,将生效 [AllowAnonymous]
授权方式基本上授权只有:Policy、Role、Scheme 这3种方式,对应 Authorize 标签的3个属性 。
1 Policy(策略)推荐的授权方式,在 ASP.NET Core 的官方文档提及最多的 。一个 Policy 可以包含多个要求(要求可能是 Role 匹配,也可能是 Claims 匹配,也可能是其他方式 。)
下面举个基础例子(说是基础例子,主要是基于 Policy 的授权方式可以不断深入追加一些配置):
在 Program.cs 中,添加两条 Policy:
policy1 要求用户拥有一个 Claim,其 ClaimType 值为 EmployeeNumber 。
policy2 要求用户拥有一个 Claim,其 ClaimType 值为 EmployeeNumber,且其 ClaimValue 值为1、2、3、4 或 5 。
builder.Services.AddAuthorization(options => {options.AddPolicy("policy1", policy => policy.RequireClaim("EmployeeNumber"));options.AddPolicy("policy2", policy => policy.RequireClaim("EmployeeNumber", "1", "2", "3", "4", "5"));})在控制器中添加 [Authorize] 标签即可生效:
[Authorize(Policy = "policy1")]public class TestController : ControllerBase或在控制器的 Action 上:
public class TestController : ControllerBase{[Authorize(Policy = "policy1")]public ActionResult<string> GetTest => "GetTest";}2 Role(角色)基于角色授权,只要用户拥有角色,即可通过授权验证 。
在认证时,给用户添加角色相关的 Claim,即可标识用户拥有的角色(注:一个用户可以拥有多个角色的 Claim),如:
new Claim(ClaimTypes.Role, "admin"),new Claim(ClaimTypes.Role, "user")在 Controller 或 Action 中:
[Authorize(Roles = "user")]public class TestController : ControllerBase{public ActionResult<string> GetUser => "GetUser";[Authorize(Roles = "admin")] //与控制器的Authorize叠加作用,除了拥有user,还需拥有adminpublic ActionResult<string> GetAdmin => "GetAdmin";[Authorize(Roles = "user,admin")] //user 或 admin 其一满足即可public ActionResult<string> GetUserOrAdmin => "GetUserOrAdmin";}3 Scheme(方案)方案如:Cookies 和 Bearer,当然也可以是自定义的方案 。
由于这种方式不常用,这里不做展开,请参考官方文档按方案限制标识 。
基于策略(Policy)的授权上面已经提及了一个基于策略授权的基础例子,下面将继续深入这种授权方式 。
1 授权过程在不断深入 Policy 这种方式的授权之前,有必要将授权的过程描述一下 。授权过程描述建议结合源码查看,这样能更清楚其中的作用 。当然,这一部分是比较难懂,笔者表述可能也不够清晰,而这一部分对于完成授权的配置也不会有影响,故而如果读者看不明白或无法理解,可以暂且跳过,不必纠结 。


推荐阅读