Azure Active Directory RBAC 不返回承载令牌中的角色
Posted
技术标签:
【中文标题】Azure Active Directory RBAC 不返回承载令牌中的角色【英文标题】:Azure Active Directory RBAC Not Returning Roles in Bearer Token 【发布时间】:2017-08-04 14:10:26 【问题描述】:我正在使用带有 ASP.NET Core API 的 Azure AD 基本层,我遵循了RBAC sample。我已经在清单中设置了一个具有角色的应用程序,如下所示:
appRoles": [
"allowedMemberTypes": [ "User" ],
"displayName": "Read Device",
"id": "b2e6f6c2-c3d5-4721-ad49-0eea255ccf45",
"isEnabled": true,
"description": "Can read a device.",
"value": "read_device"
,
...
]
我已将我的 API 设置为使用 UseJwtBearerAuthentication
中间件,如下所示:
application.UseJwtBearerAuthentication(
new JwtBearerOptions()
AuthenticationScheme = "Azure Active Directory",
Authority = options.Authority,
Audience = options.ClientId,
TokenValidationParameters = new TokenValidationParameters()
RoleClaimType = "roles",
ValidateIssuer = false
)
我已授予我的用户上述“读取设备”角色:
我正在使用 Swagger UI 进行调用以获取身份验证令牌。它调用以下 URL:
https://login.microsoftonline.com/[Tenant].onmicrosoft.com/oauth2/authorize?
response_type=token
&redirect_uri=http%3A%2F%2Flocalhost%3A5100%2Fswagger%2Fo2c.html
&realm=-
&client_id=[Client ID]
&scope=http%3A%2F%2Fschemas.microsoft.com%2Fws%2F2008%2F06%2Fidentity%2Fclaims%2Frole
&state=oauth2
&resource=[Client ID]
我怀疑我没有将正确的值传递给scope
参数,所以我尝试询问我能想到的每个scope
:
&scope=openid
%20email
%20profile
%20offline_access
%20user_impersonation
%20roles
%20http%3A%2F%2Fschemas.microsoft.com%2Fws%2F2008%2F06%2Fidentity%2Fclaims%2Frole
%20read_device
如果我在清单中设置"groupMembershipClaims": "All"
,我可以看到组声明,但我需要角色。我可以登录来调用我的 API,但是我从来没有在我的 JWT 令牌中获得任何角色,所以我无法检查用户角色。我做错了什么?
【问题讨论】:
您已将用户分配给具有该角色的应用程序? 您是如何获得访问令牌的?你能证明吗?如果它是授权代码授予流程或类似的委托调用,那么它应该可以工作.. @juunas 使用代码 sn-p 更新问题。 这方面没有明显的问题,但是您实际上是如何在调用方生成访问令牌的? @junnas 我已经更新了我调用以获取身份验证令牌的 URL。我怀疑,我没有将正确的值传递给scope
参数。应该去那里?
【参考方案1】:
在我的情况下,我错误地将应用注册配置为发出安全组作为角色声明,从而覆盖清单中的应用角色。删除可选组声明并重新登录正确地发出了 id_token
的 roles
声明中的应用角色名称。
【讨论】:
【参考方案2】:事实证明,我需要请求 id_token
而不是 token
。 id_token
包含有关用户的额外声明/范围/资源。我还需要在每个请求上提供一个包含新随机 GUID 的 nonce
参数。因此,我最终得到了以下 URL:
https://login.microsoftonline.com/[Tenant].onmicrosoft.com/oauth2/authorize?
response_type=id_token
&client_id=[Client ID]
&redirect_uri=http%3A%2F%2Flocalhost%3A5000%2F
&nonce=9ac5ad8d-df44-48e6-9bd6-e72743b3625c
【讨论】:
【参考方案3】:如果您想将角色分配给用户或组(allowedMemberTypes=User):
如果您想使用角色声明执行授权,您可以 按照code sample 中的步骤操作,您可以找到角色 声明在 id_token 中。
如果你想制作一个客户端应用程序来调用你的 web api,当用户 登录,app可以根据角色检查访问规则 宣称, 您可以使用委托流程(OAuth 授权代码授予,隐式 Grant Flow..),角色声明在 access_token 中;
如果您想指定分配给客户端应用程序的角色(allowedMemberTypes=Application),您可以使用 OAuth 客户端凭据流,分配给客户端应用程序的资源 app/api 的 appRoles,您会发现角色声明在 access_token 中,查看here 的详细步骤。
更多详情请点击here。
【讨论】:
以上是关于Azure Active Directory RBAC 不返回承载令牌中的角色的主要内容,如果未能解决你的问题,请参考以下文章
text Azure Active Directory身份验证
Azure *** 客户端 Azure Active Directory 身份验证
用于查询Azure Active Directory的Azure服务
Active Directory 从浏览器访问 Azure 存储