前言
角色授权机制是确保应用程序安全性的重要组成部分,它允许开发者根据用户的角色来限制对应用程序中不同资源的访问。
基本概念:
角色授权基于用户角色的访问控制,即根据用户所属的角色来决定其能够访问的资源或执行的操作。在.NET Core中,这通常与身份认证(Authentication)一起使用,以确保只有经过验证的用户才能被授权访问特定资源。
案例
在上一篇blog 中,我们完成了对.net Core项目添加了JWT签名的生成与校验,这里,我们基于上一篇blog中演示的代码中进行改进,在jwt中添加Role信息。
c# .net core项目中使用JWT进行权限校验
角色枚举
首先,我们新建一个枚举AuthorizeRoleName,用于表示不同的角色 。
用户信息增加角色
然后在UserRes中添加一个新的属性RoleName,用于填写用户角色。
再在生成token的时候往claims中加入
这样,我们调用GetToken接口时就可以设置角色,并存储到token中。
我们来进行测试一下,将接口获取到的token放到在线解析工具 JSON Web Tokens - jwt.io中解析一下,可以看到已经有RoleeName的信息了。
增加AdminAuthorizeAttribute类
- 用途:这是一个自定义的属性(Attribute),继承自
TypeFilterAttribute
。它允许开发者通过在其上指定AuthorizeRoleName
枚举值,来标记哪些类或方法需要特定的角色授权。 - 构造函数:接收一个
AuthorizeRoleName
枚举类型的参数role
,该参数用于指定允许访问的角色。在构造函数中,它调用了基类TypeFilterAttribute
的构造函数,并传入了AdminAuthorizeFilter
类型的实例,同时将role
作为参数传递给AdminAuthorizeFilter
。 - 特性:通过
AttributeUsage
特性指定了这个自定义属性可以应用于类(Class)或方法(Method),并且允许多次应用(AllowMultiple = true
),还可以被子类继承(Inherited = true
)。
:base(typeof(AdminAuthorizeFilter)): 这是构造函数的初始化器(Constructor Initializer),它调用了基类TypeFilterAttribute的构造函数,并传递了一个参数typeof(AdminAuthorizeFilter)。typeof(AdminAuthorizeFilter)是一个Type对象,它表示AdminAuthorizeFilter类的类型信息。这里,它告诉TypeFilterAttribute,当这个自定义属性被应用时,应该使用AdminAuthorizeFilter类作为过滤器。
增加AdminAuthorizeFilter类
- 接口实现:实现了
IAuthorizationFilter
接口,这意味着它将在MVC或Razor Pages的授权流程中被调用。 - 构造函数:接收一个
AuthorizeRoleName
枚举类型的参数role
,这个参数是通过AdminAuthorizeAttribute
传递过来的,用于指定允许访问的角色。 - OnAuthorization方法:这是授权逻辑的核心。首先,它检查用户是否已认证(即是否已经登录)。如果用户未认证,则返回一个
ChallengeResult
,这通常会导致用户被重定向到登录页面。如果用户已认证,则通过调用GetCurrentUserRole
方法获取用户的角色,并与允许的角色进行比较。如果用户角色不匹配,则返回一个ForbidResult
,这通常表示用户没有权限访问该资源,并返回403 Forbidden状态码。 - GetCurrentUserRole方法:这是一个辅助方法,用于从
HttpContext
中提取用户的角色信息。它查找用户声明(Claims)中类型为"RoleName"的声明,并将其值尝试转换为AuthorizeRoleName
枚举类型。如果转换成功,则返回该枚举值;如果失败或找不到角色声明,则抛出异常。
调整获取用户信息接口
在之前的GetUser接口上增加属性标签
表示只有role为 Administrator 的角色才能访问此接口。
测试一下!
当GetToken时设置Role为0,即(Administrator )时,获得的token去访问GetUser时是可以的。
设置为其他时,则断点会进入这里,接口返回403
项目代码
该项目的案例源代码我已经上传至gitee,需要的可自取
AuthenticationAndAuthorization: .net Core Web Api的Token生成,JWT签名,验证与授权 (gitee.com)
https://gitee.com/libihao520/authentication-and-authorization