如何获取用户的 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>
我有使用 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>