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_tokenroles 声明中的应用角色名称。

【讨论】:

【参考方案2】:

事实证明,我需要请求 id_token 而不是 tokenid_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 存储

Azure Active Directory Powershell 管理

使用 azure-cli 访问 Azure Active Directory 的令牌