如何获取用户的 group/role 个名称

How to get group/role names for the user

我有使用 adal.js 的 SPA 应用程序。我可以正常登录并更新令牌。我注意到在用户配置文件中没有组,所以我更改了 Azure AD 中的清单:

Old: "groupMembershipClaims": null
New: "groupMembershipClaims": "All"

更改后,我可以在客户端看到组数组,但它只包含 GUID。服务器端(.NET Core Web Api)是一回事。我可以在声明中看到该组,但名称为空。这是因为该组是从本地企业 AD 同步到 Azure AD 吗?

我想使用授权属性将某些操作限制为属于特定组的用户。例如

[Authorize(Roles = "Admin")]

编辑:角色和组一样吗?

我也想在客户端获得此信息,以便我可以禁用某些按钮等。

您只能获取声明中组的 ID。通常您无论如何都不想使用组名,因为任何人都可以轻松更改它们。 GUID无法更改,所以它更可靠。

我认为您可以在配置身份验证时指定RoleClaimType作为组声明,然后使用[Authorize]中的GUID。我个人会觉得它有点混乱。在经典 MVC 中,我会编写一个自定义 AuthorizeAttribute 来检查用户的组声明是否包含所需的值。这样做并不难,它允许您将组指定为字符串,然后从配置中获取组 GUID。

如@rasmusw 所述,组和角色不同。在我们的例子中,访问权限是使用组(从本地 AD 同步)授予的,所以我决定执行以下操作

配置组实际上是角色

app.UseJwtBearerAuthentication(new JwtBearerOptions
    {
        TokenValidationParameters = new TokenValidationParameters
        {
            RoleClaimType = "groups",
        }
    });

具有合理名称的硬编码对象 ID

public const string Sales = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx";

在授权属性中使用合理的名称

[Authorize(Roles = Sales)]

这不是最好的解决方案,但它似乎有效。应该注意的是,ClaimsPrincipal 仅包含组的对象 ID。我决定注入包含 "Sales"、"Marketing" 等角色的自定义 IUserContext,这样我就不必处理代码中的对象 ID。有了它,我可以轻松地使用类似的东西:

user.IsInRole(Sales)

只是给尝试这种解决方案的人的提示(角色组)。将您的网站发布到 Azure 后,您可能会遇到问题,这是我的情况,解决方案是将以下行添加到您的 web.config :

<system.webServer>
   <modules>
    <remove name="RoleManager" /> 
....
  </modules>