共用方式為


在令牌中設定群組宣告和應用程式角色

本文可協助您使用應用程式角色定義來設定應用程式,並將安全組指派給應用程式角色,讓您可以改善彈性和控制,同時以最低許可權增加應用程式安全性。

Microsoft Entra ID 支援將使用者指派 的安全組、Microsoft Entra 目錄角色和通訊群組當做令牌中的宣告傳送。 您可以使用此方法在應用程式中驅動授權。 不過,Microsoft Entra ID 會依據令牌的大小,限制令牌中的群組支援。 當使用者是太多群組的成員時,令牌中沒有任何群組。

在本文中,您將瞭解使用 Microsoft Entra 群組支援在令牌中取得使用者資訊的替代方法。 相反地,您會使用應用程式角色定義來設定應用程式,並將群組指派給應用程式角色。 此 零信任 開發人員最佳做法可改善彈性和控制,同時以最低許可權提高應用程式安全性。

您可以在 令牌中設定群組宣告 ,以在應用程式內用於授權。 請記住,只有在您收到令牌時,令牌中的群組資訊才會是目前的。 群組宣告支援兩個主要模式:

  • 由其 Microsoft Entra 物件識別碼 (OID) 屬性識別的群組。
  • sAMAccountName Active Directory 同步處理群組和使用者的 或 GroupSID 屬性所識別的群組。

群組成員資格可以驅動授權決策。 例如,下列範例會顯示令牌中的一些宣告。 您可以將群組宣告和角色新增至標識碼或存取令牌。

"aud": "e18c04b1-4868-4b93-93d1-8d71f17ab99b", 
"iss": "https://login.microsoftonline.com/833ced3d-cb2e-41de-92f1-29e2af035ddc/v2.0", 
"iat": 1669657224, "nbf": 1669657224, "exp": 1669661124, 
"groups": [ 
   "0760b6cf-170e-4a14-91b3-4b78e0739963", 
   "3b2b0c93-acd8-4208-8eba-7a48db1cd4c0" 
 ],
"oid": "cb7eda1b-d09a-40ae-b8bb-37836ebc6abd",
"sub": "3OBtLXUC2ZrN_ADLNjW9X4o0lcd61py7lgHw3Skh77s",
"tid": "833ced3d-cb2e-41ce-92f1-29e2af035ddc", 
"ver": "2.0", 
"wids": [ 
   "cf1c38e5-3621-4004-a7cb-879624dced7c", 
   "b79fbf4d-3ef9-4689-8143-76b194e85509" 
 ]

groups宣告陣列包含此使用者所屬群組的標識碼。 數位包含 wids 指派給此使用者的 Microsoft Entra 角色識別碼。 在這裡, cf1c38e5-3621-4004-a7cb-879624dced7c 顯示此使用者指派的角色包含應用程式開發人員和標準成員,如 3b2b0c93-acd8-4208-8eba-7a48db1cd4c0 所示。

您的應用程式可以根據這些宣告及其值是否存在,做出授權決策。 如需宣告的值wids清單,請參閱 Microsoft Entra 內建角色

若要將 和 宣告新增groups至您的令牌,請選取 [所有群組],如下列範例所示,應用程式註冊 | Token 組態 | 選擇性宣告 | 編輯群組宣告畫面。wids

[編輯群組宣告] 畫面的螢幕快照顯示選取的群組類型:指派給應用程式的群組。

群組超額

當您要求令牌中的所有群組時,如上述範例所示,您無法依賴令牌中有宣告的 groups 令牌。 令牌和 groups 宣告有大小限制,因此它們不會變得太大。 當使用者是太多群組的成員時,您的應用程式必須從 Microsoft Graph 取得使用者的群組成員資格。 宣告中的 groups 群組限制如下:

  • JSON Web 令牌的 200 個群組(JWT)。
  • 安全性判斷提示標記語言 (SAML) 令牌的 150 個群組。
  • 使用隱含流程時有六個群組(例如,使用 ASP.NET 核心,透過混合式流程的隱含流程部分取得標識符令牌)。
    • 單頁 Web 應用程式不再建議使用隱含流程。
    • 隱含流程只能用於 Web 應用程式中的標識碼令牌,絕不是 OAuth2 混合式流程中的存取令牌。

如果您使用 OpenID 連線 或 OAuth2,則令牌中最多可以有 200 個群組。 如果您使用 SAML,您只能有 150 個群組,因為 SAML 令牌大於 OAuth2 和 OpenID 連線 令牌。 如果您使用隱含流程,限制為六個,因為這些回應會顯示在URL中。 在所有這些情況下, groups 您看不到指示(稱為群組超額),告知使用者是太多群組的成員,無法放入您的令牌中。

在下列令牌範例中,若是 OpenID 連線或 OAuth2,JSON Web 令牌 (JWT),如果使用者是太多群組的成員,則不會 groups 有宣告。 相反地,有一個 _claim_names 宣告包含 groups 數位的成員。

範例令牌的螢幕快照顯示查詢。

在上述令牌範例中,您會看到 groups 宣告應該對應至 src1。 理論上,您接著會尋找 _claim_sources 宣告, src1 然後尋找成員。 您可以在該處找到用來取得群組成員資格的 Graph 查詢。 不過,在範例 Graph 查詢中看到的內容有問題。 它會移至 Azure AD Graph(Microsoft 即將淘汰),因此請勿使用它。

隱含流量超額指示是透過 hasgroups 宣告 groups 而非宣告來完成。

若要確保使用群組成員資格的適當授權,請讓應用程式檢查 groups 宣告。 如果有,請使用該宣告來判斷使用者的群組成員資格。 groups如果沒有宣告,請檢查宣告是否存在hasgroups,或是_claim_names具有groups數位成員的宣告。 如果其中一個宣告存在,則使用者是令牌太多群組的成員。 在此情況下,您的應用程式必須使用 Microsoft Graph 來判斷使用者的群組成員資格。 請參閱 列出用戶的成員資格(直接和可轉移), 以尋找用戶所屬的所有群組,包括直接和可轉移。

如果您的應用程式需要即時群組成員資格資訊,請使用 Microsoft Graph 來判斷群組成員資格。 請記住,您收到的令牌中的資訊只有在您取得令牌時才會是最新的。

請參閱下列 應用程式註冊 | Token | 設定選擇性宣告 | 編輯群組宣告畫面的範例。 避免達到群組超額宣告的其中一種方式,是在 [編輯群組宣告] 畫面上選取指派給應用程式的群組,而不是 [所有群組]。

[編輯群組宣告] 畫面的螢幕快照,其中顯示選取的群組類型:安全組、目錄角色和所有群組。

當您選取 指派給應用程式的群組時,如果下列條件成立,則宣告中 groups 會包含群組:

截至本文的發行集, 指派給應用程式 選項的群組不支援間接成員資格。 群組指派至少需要 P1 層級授權。 免費租用戶無法將群組指派給應用程式。

群組和應用程式角色

另一個避免群組超額問題的方法,是讓應用程式定義允許使用者和群組作為成員類型的應用程式角色。 如下列 應用程式註冊 | 應用程式角色建立應用程式角色 | 畫面的範例所示,請選取 [允許的成員類型的使用者/群組]。

[建立應用程式角色] 畫面的螢幕快照顯示 [允許的成員類型:使用者/群組]。

應用程式的註冊中建立應用程式角色之後,IT 專業人員可以將 使用者和群組指派給角色。 您的應用程式會在令牌中取得 roles 宣告(應用程式標識符令牌、API 的存取令牌),以及所有已登入使用者指派的角色,如下列令牌範例所示。

"aud": "acaf6ce9-81f0-462a-a93d-a314070738d3",
"iss": "https://login.microsoftonline.com/833ced3d-cb2e-41de-92f1-29e2af035ddc/v2.0",
"iat": 1670826509, "nbf": 1670826509, "exp": 1670830409,
"name": "Kyle Marsh",
"oid": "cb7eda1b-d09a-419e-b8bb-37836ebc6abd",
"preferred_username": "kylemar@idfordevs.dev",
"roles": [
 "Approver",
 "Reviewer" 
],
"sub": "dx-4lf-0loB3c3uVrULnZ2VTLuRRWYff0q7-QlIfYU4",
"tid": "833ced3d-cb3e-41de-92f1-29e2af035ddc",

請記得讓應用程式處理下列條件:

  • roles沒有索賠
  • 用戶沒有角色指派
  • 當使用者有多個角色指派時,宣告中的 roles 多個值

當您建立允許使用者和群組作為成員的應用程式角色時,一律定義沒有提高權限授權角色的基準使用者角色。 當企業應用程式設定需要指派時,只有直接指派給應用程式的使用者,或指派給應用程式之群組中的成員資格,才能使用應用程式。

如果您的應用程式已定義允許使用者和群組作為成員的應用程式角色,則當使用者或群組指派給應用程式時,其中一個定義的應用程式角色必須是使用者或群組指派給應用程式的一部分。 如果您的應用程式只為應用程式定義提升許可權的角色(例如 admin),則所有使用者和群組都會獲指派系統管理員角色。 當您定義基底角色(例如 user),指派給應用程式的使用者和群組可以指派基底使用者角色。

除了避免群組超額宣告之外,使用角色的另一個優點不需要在群組識別碼或名稱之間對應,以及它在應用程式中的意義。 例如,您的程式代碼可以尋找系統管理員角色宣告,而不是逐一查看宣告中的 groups 群組,並決定應該允許哪些群組標識符的系統管理員功能。

驗證和使用程式代碼中的角色

當您為應用程式定義應用程式角色時,您必須負責為這些角色實作授權邏輯。 請參閱 在應用程式中 實作角色型訪問控制,以瞭解如何在應用程式中實作授權邏輯。

下一步