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