提前感谢您对此事的帮助!
我希望有人可以帮我弄清楚如何通过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 :(得分: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/)http://schemas.microsoft.com/ws/2008/06/identity/claims/role
来更改当前主体。必须在身份验证中间件答案 2 :(得分:1)
我无权发表评论,所以我要从这里查询。你为什么要这样做
[Authorize(Roles = "myGroupName")]
据我记得当我实施基于群组的授权时,我还在打字
[Authorize(Roles = "myRoleName")]
不是其他方式。