0

我有使用adal.js的SPA应用程序。我可以登录并更新令牌。我注意到,在用户配置文件没有组,所以我在Azure的AD改变清单:如何获得用户的组/角色名称

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

这种变化之后,我可以看到在客户端上的组阵,但只包含的GUID。服务器端(.NET Core Web Api)是一样的。我可以在索赔中看到该组,但名称为空。这是因为该组是从本地公司AD同步到Azure AD的吗?

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

[Authorize(Roles = "Admin")] 

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

我也想有客户端上的这一信息,这样我可以禁用某些按键等

+1

角色和组是不一样的。团队是你从内部广告中习惯的。角色是每个应用程序。您可以在应用程序设置中的门户中定义它们,并将用户分配给它们。默认情况下,角色是JWT令牌的一部分,而组不是。除非你使用''groupMembershipClaims'',正如你已经想到的那样。 – RasmusW

回答

1

你只能获得各组的ID在权利要求。通常情况下,您不想使用组名,因为任何人都可以轻松更改组名。 GUID无法更改,因此它更可靠。

我想你可能指定RoleClaimType配置被验证时,该组织声称,然后在[Authorize]使用的GUID。就我个人而言,我会觉得有点混乱。在经典的MVC中,我会写一个自定义的AuthorizeAttribute来检查用户的组声明是否包含所需的值。这样做并不困难,因此它允许您将组指定为字符串,然后从配置中获取组GUID。

0

正如@rasmusw所说,团体和角色是不同的。在我们的例子中使用群体(从同步上部署AD)给出的访问权限,所以我决定做以下

配置一个群体实际上是角色

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

硬代码对象有健全的名字

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

使用在授权attribu理智名IDS TE

[Authorize(Roles = Sales)] 

它是不是最漂亮的解决方案,但它似乎工作。应该注意的是,ClaimsPrincipal只包含组的对象ID。我决定注入包含诸​​如“销售”,“市场营销”之类的角色的自定义IUserContext,以便我不必在代码中处理对象ID。因此,我可以很容易地使用类似的东西:

user.IsInRole(Sales) 
+0

我在回答中提到了这是一个可能的解决方案,但一个问题是,现在您已经硬编码到一个组,并且不能通过配置设置进行更改。我有几种情况,用户可能有权访问测试环境,但我们不希望他们在生产中拥有相同的访问权限。 – juunas