【发布时间】:2017-04-22 17:00:38
【问题描述】:
我目前正在使用MVC 5 和Web API 2 构建具有JWT 和OWIN 身份验证的Web API。我似乎所有这些都按预期工作。但是,我现在想实施角色授权,目前正在碰壁。
我知道在您的端点上,您可以像这样指定Authorize 属性:
[Authorize(Roles="Admin")]
我想为基于角色的授权构建一个更强大的类型化解决方案,以更好地处理我需要的东西,这就是我遇到的问题。
现在,当用户向我的oauth/token 端点提交username 和password 时,我正在生成我的JWT,这会在我的数据库中查找用户并返回已存储的enum Flag用户。获取用户信息后,我为我的ClaimsIdentity 创建了一个Role Claim,如下所示:
private void GenerateIdentityRoles()
{
_identity.AddClaim(new Claim(ClaimTypes.Role, _userRole.Roles.ToString()));
}
为了进一步说明,我在生成令牌的过程中调用了GenerateIdentityRoles 方法,_userRole 是我从数据库返回的经过验证的用户记录。 Roles 参数是我存储的枚举标志。
我的Bearer 令牌从那里返回给用户,然后它可以用于访问任何带有[Authorize] 属性的端点。
有没有一种方法可以创建一个继承自AuthorizeAttribute 类的自定义属性,该属性的工作方式与[Authorize(Roles="Admin")] 相同?但是,我可以只指定 [AuthorizeRolesAttribute(UserRoleEnum.Admin)] 而不是指定字符串类型,然后在我的 AuthorizeRolesAttribute 类中从 JWT 承载令牌中获取传入的 Roles Claim,将其转换回枚举标志,然后检查是否它包含使用HasFlag 方法指定的标志?
请注意,我目前不太关心从令牌返回的角色声明字符串,但更关心的是获取它。此外,这对我来说是一个非常新的概念,所以我真的只是边走边学。如果我的任何理解不正确,我完全愿意接受推理和其他解决方案。
【问题讨论】:
标签: c# asp.net-mvc-5 oauth-2.0 asp.net-web-api2 jwt