【问题标题】:Flag Role Enum with JWT Bearer Token and Custom AuthorizeAttribute使用 JWT 不记名令牌和自定义 AuthorizeAttribute 标记角色枚举
【发布时间】:2017-04-22 17:00:38
【问题描述】:

我目前正在使用MVC 5Web API 2 构建具有JWT 和OWIN 身份验证的Web API。我似乎所有这些都按预期工作。但是,我现在想实施角色授权,目前正在碰壁。

我知道在您的端点上,您可以像这样指定Authorize 属性:

[Authorize(Roles="Admin")]

我想为基于角色的授权构建一个更强大的类型化解决方案,以更好地处理我需要的东西,这就是我遇到的问题。

现在,当用户向我的oauth/token 端点提交usernamepassword 时,我正在生成我的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


    【解决方案1】:

    是的,这应该是可能的。

    子类化AuthorizeAttribute,并覆盖IsAuthorized 方法。 在检查操作是否具有AllowAnonynous 属性和您不想弄乱的其他详细信息之后,调用此方法来检查特定用户是否具有访问权限。 这是默认实现查看用户名和角色名称的地方,但如果您愿意,您可以在此处执行完全不同的操作。

    Github 上提供了 Asp.Net MVC 和 Web API 的源代码。 可以看到AuthorizeAttribute源here

    【讨论】:

    • 感谢您的回复。您提供给AuthorizeAttribute 源的链接似乎已损坏。你能帮我仔细检查一下吗?谢谢!
    • 你是说这个link吗?如果是这样,我看不到覆盖传入角色声明的方法。您有什么想法可以实现吗?
    【解决方案2】:

    不必那么复杂。

    如果你想让它成为强类型,你可以使用像这样的常量类:-

     public static class Constants
        {
            public static class Roles
            {
                public const string Admin = "Admin";
                public const string User = "User";
            }
    
        }
    
    [Authorize(Roles=Constants.Roles.Admin)]
    

    不需要枚举。

    【讨论】:

    • 感谢您的回复。但是,如果我要沿着常量路线走下去,我还不如将字符串类型用于角色参数......它本质上是在做同样的事情。这也无助于我通过角色声明发送枚举值这一事实。
    • 抱歉...我现在意识到一个用户可以拥有多个角色,对吧?
    猜你喜欢
    • 2017-10-26
    • 2015-08-13
    • 2021-10-07
    • 2022-06-11
    • 2021-10-05
    • 1970-01-01
    • 1970-01-01
    • 2016-09-25
    • 2020-03-21
    相关资源
    最近更新 更多