使用Auth0在ASP.NET中通过角色/组进行授权

IfT*_*rue 2 asp.net authorization jwt asp.net-web-api auth0

在此事先感谢您的帮助!

我希望有人可以帮我弄清楚如何通过Auth0授权扩展中分配的组来授权API访问.

我目前正在使用web api中的[Authorize]属性 - 它允许api调用,如果他们已成功登录并阻止它,如果没有.

但是,如果我尝试[Authorize(Roles ="myGroupName")]授权失败.如果我在Auth0网站上的用户仪表板中手动将其添加到用户app_metadata而不是通过扩展程序分配,则会出现相同的情况.

我的项目是通过遵循Angular Quick Start和Asp.Net Quick Start来设置的.我验证令牌服务器端的webapiconfig是:

 class WebApiConfig
{
    public static void Register(HttpConfiguration configuration)
    {
        var clientID = WebConfigurationManager.AppSettings["auth0:ClientId"];
        var clientSecret = WebConfigurationManager.AppSettings["auth0:ClientSecret"];

        configuration.MessageHandlers.Add(new JsonWebTokenValidationHandler()
        {
            Audience = clientID,
            SymmetricKey = clientSecret
        });

        configuration.Routes.MapHttpRoute("API Default", "api/{controller}/{id}",
            new { id = RouteParameter.Optional });
    }
}
Run Code Online (Sandbox Code Playgroud)

Joã*_*elo 5

Auth0授权延长目前通过组的概念支持的授权决定.您可以创建组,将用户分配给该组,并将应用程序配置为只能由特定组中的用户访问.所有这些都将自动处理,并且应用程序预期组之外的任何用户都将被拒绝完全访问.

您的用例有点不同,但仍然有效.您希望为生成的令牌发送配置了扩展的组,以便应用程序本身根据这些值做出授权决策.

为了在扩展中配置的组在令牌中发送,您需要做的第一件事就是请求它们.为此,您需要groups在执行身份验证请求时包括范围.

将用户的组成员身份添加到传出令牌(可以通过OpenID组范围请求);

(重点是我的,来源:授权扩展文档,部分规则行为)

如果您使用该范围请求令牌然后在jwt.io中对其进行解码,您将得到与此类似的内容(实际组因用户而异):

{
  "groups": [
    "GROUP-1",
    "GROUP-2"
  ],
  "iss": "https://[tenant].auth0.com/"
}
Run Code Online (Sandbox Code Playgroud)

现在,在ASP .NET API端验证此信息.假设您正在使用的示例是此示例(ASP.NET Web API),则令牌中包含的组信息将映射到以下声明:

  • 输入:groups| 值:GROUP-1
  • 输入:groups| 值:GROUP-2

发生这种情况是因为JsonWebToken类中存在的逻辑通过创建共享相同类型的每值声明来处理来自JWT有效内容的数组.

最后一部分是确保AuthorizeAttribute检查这些类型的声明,groups而不是尝试查找角色声明.您应该能够通过更改类中的RoleClaimType常量而不是JsonWebToken使用值来实现此"groups"目的"http://schemas.microsoft.com/ws/2008/06/identity/claims/role".