如何获取用户的组/角色名称

问题描述 投票:1回答:3

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

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

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

我想使用Authorize属性将某些操作限制为属于某个组的用户。例如。

[Authorize(Roles = "Admin")]

编辑:角色是否与群组相同?

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

asp.net-core azure-active-directory adal asp.net-core-webapi
3个回答
1
投票

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

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


1
投票

正如@rasmusw所述,团队和角色是不同的。在我们的例子中,访问权限是使用组(从内部AD同步)给出的,所以我决定执行以下操作

配置组实际上是角色

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

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

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

在Authorize属性中使用合理的名称

[Authorize(Roles = Sales)]

它不是最漂亮的解决方案,但似乎有效。应该注意,ClaimsPrincipal仅包含组的对象ID。我决定注入包含像“Sales”,“Marketing”这样的角色的自定义IUserContext,这样我就不必处理代码中的对象ID了。有了它,我可以很容易地使用像:

user.IsInRole(Sales)

0
投票

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

<system.webServer>
   <modules>
    <remove name="RoleManager" /> 
....
  </modules>
© www.soinside.com 2019 - 2024. All rights reserved.