ASP.NET Core 6.0怎么添加JWT认证和授权功能


本篇内容介绍了“ASP.NETCore6.0怎么添加JWT认证和授权功能”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Authentication 和 Authorization 长得很像,傻傻分不清楚。Authentication(认证):标识用户的身份,一般发生在登录的时候。Authorization(授权):授予用户权限,指定用户能访问哪些资源;授权的前提是知道这个用户是谁,所以授权必须在认证之后。安装相关 Nuget 包:Microsoft.AspNetCore.Authentication.JwtBearer准备配置信息(密钥等)添加服务调用中间件实现一个 JwtHelper,用于生成 Token控制器限制访问(添加 Authorize 标签)安装 Microsoft.AspNetCore.Authentication.JwtBearer在程序包管理器控制台中:在 appsetting.json 中,添加一个 Jwt 节点在 Program.cs 文件中注册服务。调用 UseAuthentication(认证),必须在所有需要身份认证的中间件前调用,比如 UseAuthorization(授权)。主要是用于生成 JWT 的 Token。该 JwtHelper 依赖于 IConfiguration(为了读取配置文件),将 JwtHelper 的创建交由 DI 容器,在 Program.cs 中添加服务:将 JwtHelper 注册为单例模式。新建一个 AccountController,以构造函数方式注入 JwtHelper,添加两个 Action:GetToken 用于获取 Token,GetTest 打上 [Authorize] 标签用于验证认证。方式一:通过 Postman、Apifox 等接口调试软件调试使用 Postman 调用 /api/Account/GetToken 生成 Token在调用 /api/Account/GetTest 时传入 Token,得到返回结果方式二:在浏览器控制台调试调试 /api/Account/GetToken调试 /api/Account/GetTest注意:授权必须基于认证,即:若没有完成上文关于认证的配置,则下面的授权是不会成功的。授权部分,将先介绍相关标签、授权方式,再介绍基于策略的授权。这三部分大致的内容如下描述:相关标签:Authorize 和 AllowAnonymous授权方式:介绍 Policy、Role、Scheme 的基本内容基于策略(Policy)的授权:深入 Policy 授权方式授权相关标签具体请查考官方文档简单授权[Authorize]打上该标签的 Controller 或 Action 必须经过认证,且可以标识需要满足哪些授权规则。授权规则可以是 Policy(策略)、Roles(角色) 或 AuthenticationSchemes(方案)。[AllowAnonymous]允许匿名访问,级别高于 [Authorize] ,若两者同时作用,将生效 [AllowAnonymous]基本上授权只有:Policy、Role、Scheme 这3种方式,对应 Authorize 标签的3个属性。推荐的授权方式,在 ASP.NET Core 的官方文档提及最多的。一个 Policy 可以包含多个要求(要求可能是 Role 匹配,也可能是 Claims 匹配,也可能是其他方式。)下面举个基础例子(说是基础例子,主要是基于 Policy 的授权方式可以不断深入追加一些配置):在 Program.cs 中,添加两条 Policy:policy1 要求用户拥有一个 Claim,其 ClaimType 值为 EmployeeNumber。policy2 要求用户拥有一个 Claim,其 ClaimType 值为 EmployeeNumber,且其 ClaimValue 值为1、2、3、4 或 5。在控制器中添加 [Authorize] 标签即可生效:或在控制器的免费云主机域名 Action 上:基于角色授权,只要用户拥有角色,即可通过授权验证。在认证时,给用户添加角色相关的 Claim ,即可标识用户拥有的角色(注:一个用户可以拥有多个角色的 Claim),如:在 Controller 或 Action 中:方案如:Cookies 和 Bearer,当然也可以是自定义的方案。由于这种方式不常用,这里不做展开,请参考官方文档按方案限制标识。基于策略(Policy)的授权上面已经提及了一个基于策略授权的基础例子,下面将继续深入这种授权方式。1 授权过程在不断深入 Policy 这种方式的授权之前,有必要将授权的过程描述一下。授权过程描述建议结合源码查看,这样能更清楚其中的作用。当然,这一部分是比较难懂,笔者表述可能也不够清晰,而这一部分对于完成授权的配置也不会有影响,故而如果读者看不明白或无法理解,可以暂且跳过,不必纠结。建议看一下ASP.NET Core使用JWT认证授权的方法这篇文章,文章将授权相关的源码整理出来了,并说明了其中的关系。这里简单梳理一下:与授权相关的 interface 和 class 如下:这些 interface 和 class 的关系以及授权过程是这样的:DefaultAuthorizationService 实现 IAuthorizationServiceAuthorizeAsync 方法。AuthorizeAsync 方法会获取到所有实现了 IAuthorizationHandler 的实例,并循环调用所有实例的 HandleAsync 方法检查是否满足授权要求,如果有任一一个 HandleAsync 返回了 Fail 则将结束循环(细节请参考官方文档处理程序返回结果),并禁止用户访问。IAuthorizationHandler 的作用如上一点所述,提供了一个 HandleAsync 方法,用于检查授权。IAuthorizationRequirement 是一个要求,主要是配合 AuthorizationHandler 使用。AuthorizationHandler 实现了 IAuthorizationHandlerHandleAsync 方法,并提供了一个 HandleRequirementAsync 的方法。HandleRequirementAsync 用于检查 Requirement(要求)是否满足。HandleAsync 的默认实现为获取所有实现 TRequirement 的请求(且该请求由 Policy 添加进列表里),循环调用 HandleRequirementAsync,检查哪个要求(Requirement)能满足授权。简述一下:[Authorize] 标签生效时,调用的是 IAuthorizationServiceAuthorizeAsync(由 DefaultAuthorizationService 实现)。AuthorizeAsync 会去调用所有 IAuthorizationHandlerHandleAsync (由 AuthorizationHandler 实现)。HandleAsync 会去调用 AuthorizationHandlerHandleRequirementAsync 的方法。注意:这里只是列出了主要的接口和类,部分没有列出,如:IAuthorizationHandlerProvider(这个接口的默认实现 DefaultAuthorizationHandlerProvider,主要是用于收集 IAuthorizationHandler 并返回 IEnumerable)2 实现说明IAuthorizationService 已默认实现,不需要我们做额外工作。IAuthorizationHandlerAuthorizationHandler 实现。所以我们要做的,是:第一步,准备 Requirement 实现 IAuthorizationRequirement第二步,添加一个 Handler 程序继承 AuthorizationHandler 并重写 HandleRequirementAsync 方法在实现 Requirement 之前,我们需要先定义一些权限项,主要用于后续作为 Policy 的名称,并传入 我们实现的 Requirement 之中。如上,定义了“增”、“删”、“改”等权限,其中 User 将拥有完整权限。使用 Name 属性表示权限的名称,与 UserPermission 中的常量对应。这里假定用户的 Claim 中 ClaimType 为 Permission 的项,如:如上,标识该用户用户 UserCreate 和 UserUpdate 的权限。注意:当然,实际程序我们肯定不是这样实现的,这里只是简易示例。接着,实现一个授权 Handler:运行 HandleRequirementAsync 时,会将用户的 Claim 中 ClaimType 为 Permission 的项取出,并获取其 Value 组成一个 List。接着验证 Requirement 是否满足授权,满足则运行 context.Succeed 。在 Program.cs 中,将 PermissionAuthorizationHandler 添加到 DI 中:控制器如下:基于上面的假定,用户访问接口的情况如下:至此,基于策略(Policy)的授权其实已经基本完成。接下去的内容,将是对上面一些内容的完善或补充。完善:实现策略提供程序 PolicyProvider一般添加授权策略如下是在 Program.cs 中,方式如下:通过 AuthorizationOptions.AddPolicy 添加授权策略这种方式不灵活,无法动态添加。通过实现 IAuthorizationPolicyProvider 并添加到 DI 中,可以实现动态添加 Policy。IAuthorizationPolicyProvider 的默认实现为 DefaultAuthorizationPolicyProvider 。实现一个 PolicyProvider 如下:注意:自定义的 TestAuthorizationPolicyProvider 必须实现 IAuthorizationPolicyProvider,否则添加到 DI 时会不生效。在 Program.cs 中,将自定义的 PolicyProvider 添加到 DI 中:注意:只会生效最后一个添加的 PolicyProvider。补充:自定义 AuthorizationMiddleware自定义 AuthorizationMiddleware 可以:返回自定义的响应增强(或者说改变)默认的 challenge 或 forbid 响应在 MiniApi 中几乎都是形如 MapGet() 的分支节点,这类终结点无法使用 [Authorize] 标签,可以用使用 RequireAuthorization(“Something”) 进行授权,如:“ASP.NETCore6.0怎么添加JWT认证和授权功能”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注百云主机网站,小编将为大家输出更多高质量的实用文章!

相关推荐: 怎么使用C语言代码实现学生成绩管理系统

这篇文章主要介绍“怎么使用C语言代码实现学生成绩管理系统”,在日常操作中,相信很多人在怎么使用C语言代码实现学生成绩管理系统问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么使用C语言代码实现学生成绩管理系统”的疑惑有所帮助!接…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 04/19 16:51
下一篇 04/19 16:51

相关推荐