我有使用adal.js的SPA应用程序。我可以登录确定并续订令牌。我注意到在用户配置文件中没有组,所以我更改了Azure AD中的清单:
Old: "groupMembershipClaims": null
New: "groupMembershipClaims": "All"
在更改之后,我可以在客户端看到groups数组,但它只包含GUID。服务器端(.NET Core Web Api)是一回事。我可以在声明中看到该组,但名称为null。这是因为该组已从本地公司AD同步到Azure AD吗?
我想使用Authorize属性将某些操作限制为属于某个组的用户。 E.g。
[Authorize(Roles = "Admin")]
编辑:角色是否与群组相同?
我还希望在客户端获得此信息,以便我可以禁用某些按钮等。
答案 0 :(得分:1)
You only get the ids of the groups in the claims. Typically you would not want to use the group names anyway, since they can be changed easily by anyone. The GUID can't be changed so it's a bit more reliable.
I think you could specify RoleClaimType
to be the groups claim when configuring authentication, and then use the GUIDs in [Authorize]
. Personally I would find it a bit confusing. In classic MVC I would write a custom AuthorizeAttribute
that would check that the user's group claims contain the required value. It would not be difficult to make it so that it allows you to specify the group as a string, and then gets the group GUID from configuration.
答案 1 :(得分:1)
正如@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。我决定注入包含角色的自定义IUserContext,例如" Sales"," Marketing"所以我不必处理代码中的对象ID。有了这个,我可以很容易地使用类似的东西:
user.IsInRole(Sales)
答案 2 :(得分:0)
对于尝试这种解决方案的人(角色小组)而言,这只是一个提示。在将网站发布为天蓝色后,您可能会遇到问题,这就是我的情况,解决方案是在web.config中添加以下几行:
<system.webServer>
<modules>
<remove name="RoleManager" />
....
</modules>