我有使用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")]
编辑:角色是否与群组相同?
我也希望在客户端获得此信息,以便我可以禁用某些按钮等。
您只能获得声明中组的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属性中使用合理的名称
[Authorize(Roles = Sales)]
它不是最漂亮的解决方案,但似乎有效。应该注意,ClaimsPrincipal仅包含组的对象ID。我决定注入包含像“Sales”,“Marketing”这样的角色的自定义IUserContext,这样我就不必处理代码中的对象ID了。有了它,我可以很容易地使用像:
user.IsInRole(Sales)
只是提示尝试这种解决方案的人(角色组)。将您的网站发布到azure后可能会遇到问题,这是我的情况,解决方法是在web.config中添加以下行:
<system.webServer>
<modules>
<remove name="RoleManager" />
....
</modules>