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

时间:2016-10-01 13:59:21

标签: asp.net asp.net-web-api authorization jwt auth0

提前感谢您对此事的帮助!

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

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

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

我的项目是按照Angular Quick Start和Asp.Net快速入门设置的。我验证令牌服务器端的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 });
    }
}

3 个答案:

答案 0 :(得分:5)

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

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

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

  

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

(重点是我的,来源:Authorization Extension Docs,部分规则行为

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

{
  "groups": [
    "GROUP-1",
    "GROUP-2"
  ],
  "iss": "https://[tenant].auth0.com/"
}

现在,要在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"来完成此操作。

答案 1 :(得分:2)

就像你知道的那样,Authorize属性使用了主体中的内容:继承IPrincipal的东西。 在web api中,它更具体;它是继承ClaimsPrincipal的东西(这实现了自己IPrincipal)。 正如您当中所知,声称就像一对键值对。 ClaimsPrincipal包含一系列键值对,这些键值对直接从身份验证令牌中获取。此身份验证令牌大部分时间由身份验证服务器以JWT(Json Web令牌)发出。大多数时候,身份验证服务器也在使用OAuth,就像你的情况一样。 如果您希望在应用程序中担任角色的用户组无法使用现成的“授权”属性进行操作,那么因为它未正确映射:{{1}使用声明类型检查声明:Auhtorize("声明类型"是键值对的"键")。这意味着,如果您希望http://schemas.microsoft.com/ws/2008/06/identity/claims/role能够正常工作,则必须使用该群组对此声明进行评估。 您可以在应用程序中执行多项操作以获得干净的授权。

  • 制作自定义Authorize属性。此Authorize属性将使用其他声明类型检查角色。引用用户组的声明类型取决于您的身份验证服务器。如果您未在身份验证服务器的文档中找到用于组的声明类型,请在调试中运行您的应用程序,并检查控制器的属性Authorize中包含的每个声明。您一定会找到您感兴趣的索赔类型。
  • 通过重新定义用户信息与生成的令牌声明之间的映射(在您的情况下,将用户的地图组映射到具有User类型的声明)来更改授权服务器的设置。通常,这可以按客户端应用程序设置,甚至可以全局设置。例如,如果您使用ADFS身份验证,AzureAD或WSO2身份验证服务器(http://wso2.com/products/identity-server/
  • ,则必须执行此操作
  • 添加一个owin中间件来修改当前主体。它将通过将包含组的声明的值复制到声明类型http://schemas.microsoft.com/ws/2008/06/identity/claims/role来更改当前主体。必须在身份验证中间件
  • 之后将此中间件插入流中

答案 2 :(得分:1)

我无权发表评论,所以我要从这里查询。你为什么要这样做

[Authorize(Roles = "myGroupName")] 

据我记得当我实施基于群组的授权时,我还在打字

[Authorize(Roles = "myRoleName")] 

不是其他方式。