Microsoft 身分識別平台中的範圍和許可權

Microsoft 身分識別平台會實作 OAuth 2.0 授權通訊協定。 OAuth 2.0 是一種可讓第三方應用程式代表使用者存取 Web 主控資源的方法。 任何與 Microsoft 身分識別平台整合的 Web 託管資源都具有資源識別碼,又稱為應用程式識別碼 URI

在本文中,您將瞭解身分識別平臺中的範圍和許可權。

下列清單顯示 Microsoft Web 裝載資源的一些範例:

  • Microsoft Graph:https://graph.microsoft.com
  • Microsoft 365 Mail API:https://outlook.office.com
  • Azure Key Vault:https://vault.azure.net

對於任何已整合 Microsoft 身分識別平台的的第三方資源也是如此。 上述任何資源都可以定義一組權限,以將該資源的功能切割成較小區塊。 例如,Microsoft Graph 除了別的之外,還定義了權限來執行下列工作:

  • 讀取使用者的行事曆
  • 寫入使用者的行事曆
  • 以使用者身分傳送電子郵件

由於這些類型的權限定義,資源對其資料以及 API 功能的公開方式有更細緻的控制。 第三方應用程式可向使用者和系統管理員要求這些權限,且必須在他們核准要求後,應用程式才可存取資料或代表使用者執行動作。

當資源的功能切割成較小的權限集時,第三方應用程式可以建立成只要求其功能運作所需的權限。 使用者和系統管理員可以知道應用程式所能存取的資料。 更加確信應用程式沒有惡意。 開發人員應總是遵守最低權限的原則,僅要求其應用程式運作所需的權限。

在 OAuth 2.0 中,這些類型的權限集合稱為「範圍」。 我們也常將其稱為「權限」。 在 Microsoft 身分識別平台,權限以字串值表示。 應用程式透過 scope 查詢參數中指定權限,以要求所需的權限。 身分識別平台支援多個定義明確的 OpenID Connect 範圍,以及資源型權限 (在資源的識別碼或應用程式識別碼 URI 後面附加權限值,以表示每個權限)。 例如,權限字串 https://graph.microsoft.com/Calendars.Read 可用來要求在 Microsoft Graph 中讀取使用者行事曆的權限。

在授權伺服器的要求中 Microsoft 身分識別平台,如果範圍參數中省略資源標識符,則資源會假設為 Microsoft Graph。 例如,scope=User.Read 相當於 https://graph.microsoft.com/User.Read

管理員受限的權限

Microsoft 身分識別平台 中的許可權可以設定為受系統管理員限制。 例如,許多較高許可權的 Microsoft Graph 許可權都需要系統管理員核准。 如果您的應用程式需要系統管理員限制的許可權,組織的系統管理員必須代表組織的使用者同意這些範圍。 下一節提供這些權限類型的範例:

  • User.Read.All:讀取所有使用者的完整配置檔
  • Directory.ReadWrite.All:將數據寫入組織的目錄
  • Groups.Read.All:讀取組織目錄中的所有群組

注意

在對 Microsoft 身分識別平台 之授權、令牌或同意端點的要求中,如果範圍參數中省略資源標識符,則資源會假設為 Microsoft Graph。 例如,scope=User.Read 相當於 https://graph.microsoft.com/User.Read

雖然消費者使用者可以授與應用程式存取這類資料,但組織使用者無法授與存取同一組敏感性公司資料。 如果應用程式向組織使用者要求存取其中一個權限,使用者會收到錯誤訊息,指出他們無權同意應用程式權限。

如果應用程式要求應用程式許可權,而系統管理員會授與這些許可權,則此授與不會代表任何特定使用者完成。 此時會直接為用戶端應用程式授與權限。 這些類型的許可權應該只供背景中執行的精靈服務和其他非互動式應用程式使用。 如需直接存取案例的詳細資訊,請參閱 Microsoft 身分識別平台 中的存取案例。

如需如何在 Web API 中公開範圍的逐步指南,請參閱 設定應用程式以公開 Web API

OpenId Connect 範圍

Microsoft 身分識別平台的 OpenID Connect 實作有幾個定義明確的範圍也託管於 Microsoft Graph:openidemailprofileoffline_access。 不支援 addressphone OpenID Connect 範圍。

如果您要求 OpenID Connect 範圍和權杖,則會取得權杖來呼叫 UserInfo 端點

範圍openid

如果應用程式使用 OpenID Connect 來登入,則必須要求 openid 範圍。 openid 範圍在公司帳戶同意頁面上顯示為 [將您登入] 權限。

此權限可讓應用程式以 sub 宣告的形式接收使用者的唯一識別碼。 此權限也可讓應用程式存取 UserInfo 端點。 在 Microsoft 身分識別平台權杖端點上,可以使用 openid 範圍來取得識別碼權杖。 應用程式可以使用這些權杖進行驗證。

範圍email

email 範圍可以搭配 openid 範圍及任何其他範圍一起使用。 它會以 email 宣告的形式為應用程式提供使用者主要電子郵件地址的存取權。

只有當使用者帳戶有相關聯的電子郵件地址時,權杖才會包含 email 宣告 (但不一定)。 如果應用程式使用 email 範圍,應用程式必須能夠處理權杖中沒有 email 宣告的情況。

範圍profile

profile 範圍可以搭配 openid 範圍及任何其他範圍一起使用。 此範圍可讓應用程式存取使用者的大量相關資訊。 它可以存取的資訊包括使用者指定的名稱、姓氏、慣用的使用者名稱和對象識別碼。

如需特定使用者的 id_tokens 參數中可用的 profile 宣告完整清單,請參閱 id_tokens 參考

範圍offline_access

offline_access 範圍可延長您應用程式代表使用者存取資源的時間。 在同意頁面上,此範圍顯示為 [繼續存取您已授與存取權的資料] 權限。

當使用者核准 offline_access 範圍時,您的應用程式就可以從 Microsoft 身分識別平台權杖端點收到重新整理權杖。 重新整理權杖會長期存在。 當舊存取權杖過期時,您的應用程式即可獲得新存取權杖。

注意

此權限目前出現在所有同意頁面上,即使流程未提供重新整理權杖也一樣 (例如隱含流程)。 如果用戶端可能從隱含流程內開始,然後進入需要有重新整理權杖的程式碼流程,此設定可解決這種情況。

在 Microsoft 身分識別平台上 (對 v2.0 端點提出要求),您的應用程式必須明確要求 offline_access 範圍,才能收到重新整理權杖。 因此,當您在 OAuth 2.0 授權碼流程中兌換授權碼時,您只會從 /token 端點接收存取令牌。

存取令牌通常大約一小時有效。 此時,您的應用程式必須將使用者重新導向回 /authorize 端點,以要求新的授權碼。 在此重新導向期間,視應用程式類型而定,使用者可能需要再次輸入其認證,或再次同意許可權。

重新整理令牌的到期時間比存取令牌還長,而且通常有效期為一天。 如需有關如何取得及使用重新整理權杖的詳細資訊,請參閱 Microsoft 身分識別平台通訊協定參考

範圍.default

.default 範圍用於泛指要求中的資源服務 (API),而不識別特定權限。 如果需要同意,則使用 .default 可表示應該提示同意應用程式註冊中列出的所有必要權限 (針對清單中的所有 API)。

scope 參數值由資源的識別碼 URI 和 .default 構成,以斜線分隔 (/)。 例如,如果資源的識別碼 URI 為 https://contoso.com,則要求的範圍是 https://contoso.com/.default。 如果您必須加上第二個斜線才能正確要求權杖,請參閱尾端斜線一節

使用 scope={resource-identifier}/.default 在功能上等同於 v1.0 端點上的 resource={resource-identifier} (其中 {resource-identifier} 是 API 的識別碼 URI,例如 Microsoft Graph 的 https://graph.microsoft.com)。

.default 範圍可用於任何 OAuth 2.0 流程,並起始管理員同意。 其使用在代理者流程客戶端認證流程中是必要的。

用戶端在單一要求中不能兼具靜態 (.default) 同意和動態同意。 因此,scope=https://graph.microsoft.com/.default Mail.Read 會因為合併範圍類型而導致錯誤。

.default如果客戶端與資源之間尚未授與任何委派許可權的同意,scope 參數只會觸發同意提示,代表登入的使用者。

如果同意存在,傳回的令牌會包含為登入使用者授與該資源的所有範圍。 但是,如果尚未授與所要求資源的權限 (或已提供 prompt=consent 參數),則會出現同意提示,要求同意用戶端應用程式註冊上針對清單中所有 API 設定的一切必要權限。

例如,如果要求範圍 https://graph.microsoft.com/.default,表示應用程式要求 Microsoft Graph API 的存取權杖。 如果至少已代表登入的使用者授與 Microsoft Graph 的一個委派許可權,登入將會繼續,且已授與該使用者的所有 Microsoft Graph 委派許可權都會包含在存取令牌中。 如果尚未授與所要求資源 (此範例中為 Microsoft Graph) 的權限,則會出現同意提示,要求同意應用程式上針對清單中所有 API 設定的一切必要權限。

範例1:使用者 (或租用戶管理員) 已授與權限

在此範例中,使用者或租用戶管理員已將 Mail.ReadUser.Read Microsoft Graph 權限授與用戶端。

如果用戶端要求 scope=https://graph.microsoft.com/.default,則不論用戶端應用程式已註冊的 Microsoft Graph 權限有何內容,都不會出現同意提示。 傳回的權杖包含範圍 Mail.ReadUser.Read

範例 2:使用者尚未授與用戶端與資源之間的權限

在此範例中,使用者和管理員都尚未在用戶端與 Microsoft Graph 之間表示同意。 用戶端已註冊 User.ReadContacts.Read 權限。 也已註冊 Azure Key Vault 範圍 https://vault.azure.net/user_impersonation

當用戶端要求 scope=https://graph.microsoft.com/.default 的權杖時,使用者會看到 Microsoft Graph User.ReadContacts.Read 範圍及 Azure Key Vault user_impersonation 範圍的同意頁面。 傳回的權杖只包含 User.ReadContacts.Read 範圍,而且只能用於 Microsoft Graph。

範例 3:使用者已同意,但用戶端要求更多範圍

在此範例中,使用者已同意用戶端的 Mail.Read。 用戶端已註冊 Contacts.Read 範圍。

用戶端首先以 scope=https://graph.microsoft.com/.default 登入。 根據回應的 scopes 參數,應用程式的程式碼只偵測到已授與 Mail.Read。 接著,用戶端使用 scope=https://graph.microsoft.com/.default 起始第二次登入,但這次使用 prompt=consent 來強制同意。 如果允許使用者同意應用程式註冊的所有許可權,則會顯示同意提示。 (如果沒有,則會顯示錯誤訊息或 管理員同意要求 窗體。 Contacts.ReadMail.Read 都會在同意提示字元中。 如果同意且登入繼續,則會傳回 Microsoft Graph 的權杖,其中包含 Mail.ReadContacts.Read

搭配 .default 用戶端使用範圍

在某些情況下,用戶端可以要求自己的 .default 範圍。 下列範例示範此案例。

// Line breaks are for legibility only.

GET https://login.microsoftonline.com/{tenant}/oauth2/v2.0/authorize
    ?response_type=token            //Code or a hybrid flow is also possible here
    &client_id=00001111-aaaa-2222-bbbb-3333cccc4444
    &scope=9ada6f8a-6d83-41bc-b169-a306c21527a5/.default
    &redirect_uri=https%3A%2F%2Flocalhost
    &state=1234

如果情況適用上述同意描述和 .default,此程式碼範例會針對所有已註冊的權限產生同意頁面。 程式碼接著傳回 id_token,而不是存取權杖。

以 Microsoft 身分識別平台為目標的新用戶端「不應該」使用此設定。 請務必從 Azure AD 驗證 連結庫 (ADAL) 移轉至 Microsoft 驗證連結庫 (MSAL)。

用戶端認證授與流程和 .default

.default 的另一種用法是在非互動式應用程式中要求應用程式角色 (又稱為應用程式權限),例如精靈應用程式經由用戶端認證授與流程來呼叫 Web API。

若要定義 Web API 的應用程式角色 (應用程式權限),請參閱在您的應用程式中新增應用程式角色

用戶端服務中的用戶端認證要求「必須」包含 scope={resource}/.default。 其中,{resource} 是應用程式打算呼叫且希望取得存取權杖的 Web API。 「不」支援使用個別應用程式權限 (角色) 來發出用戶端認證要求。 傳回的存取權杖中包含已授與該 Web API 的所有應用程式角色 (應用程式權限)。

若要將存取權授與您定義的應用程式角色,包括授與應用程式的管理員同意,請參閱設定用戶端應用程式以存取 Web API

尾端斜線和 .default

某些資源 URI 有尾端斜線,例如 https://contoso.com/,而不是 https://contoso.com。 尾端斜線可能導致權杖驗證發生問題。 主要是在要求 Azure Resource Manager (https://management.azure.com/) 的權杖時發生問題。

在此情況下,資源 URI 上的尾端斜線表示要求權杖時必須有斜線。 因此,當您要求 https://management.azure.com/ 的權杖並使用 .default 時,您必須要求 https://management.azure.com//.default (注意是雙斜線!)。

一般而言,如果您確認已發行權杖,但 API 應該接受卻拒絕權杖,請考慮加上第二個斜線,然後再試一次。

另請參閱