2016-10-01 128 views
2

在此事先感谢您的帮助!使用Auth0在ASP.NET中按角色/组授权授权

我希望有人能帮我弄清楚如何授权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 }); 
    } 
} 
+0

任何帮助都是值得赞赏的。 – IfTrue

+1

默认情况下,JsonWebTokenValidationHandler类不会添加声明角色。看看这个线程https:// auth0。com/forum/t/how-to-push-claims-to-users-profile-on-auth0-from-asp-net-5-mvc-6/2424/13 –

回答

4

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的这些声明,而不是尝试查找角色声明。您应该可以通过将JsonWebToken类中的RoleClaimType常数更改为"groups"而不是"http://schemas.microsoft.com/ws/2008/06/identity/claims/role"来实现此目的。

+0

我转而不依赖第三方,但我感谢您花时间回答。我觉得这最好解决了问题的多个方面。 – IfTrue

+0

想要添加更多关于如何添加请求的详细信息。这就是我的工作方式。 //配置Auth0 锁=新Auth0Lock(myConfig.clientID,myConfig.domain,{ AUTH:{ PARAMS:{范围: '的OpenID组'}, } }); –

0

我无权评论所以我打算从这里查询。为什么我记得当我实施基于组授权我还在打字周围

[Authorize(Roles = "myRoleName")] 

没有别的办法,你就这样

[Authorize(Roles = "myGroupName")] 

+0

嘿,男人不用担心 - 我收到评论的东西。我已经尝试了两种方式 - 手动将应用程序元数据分配给角色,并使用组的授权扩展。但是,当使用Auth0处理令牌时,两者都显示为“Group”声明。 – IfTrue

2

就像你所知道的那样,Authorize属性使用主体中的内容:继承IPrincipal的内容。 在web api中,它更具体;这是继承ClaimsPrincipal(这实现了自己IPrincipal)。 正如你当然知道的那样,索赔就像一个键值对。 ClaimsPrincipal包含一系列直接来自身份验证令牌的键值对。此认证令牌大多数时间由认证服务器发布为JWT(Json Web令牌)。大多数情况下,身份验证服务器正在使用OAuth,就像您的情况一样。 如果您希望作为应用程序中的角色的用户组通过使用开箱即用的授权属性不起作用,这是因为它没有正确映射:Auhtorize检查声明类型为http://schemas.microsoft.com/ws/2008/06/identity/claims/role (“声明类型”是键值对的“键”)。这意味着如果你想让你的Authorize工作,这个声明必须与该团体一起评估。 您可以在应用程序中执行几项操作以获得干净的授权。

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

谢谢你的回答。 – IfTrue