共用方式為


單一登錄 SAML 通訊協定

本文涵蓋saml 2.0驗證要求和回應,Microsoft Entra ID 支援單一登錄 (SSO)。

下列通訊協議圖表描述單一登錄順序。 雲端服務 (服務提供者) 會使用 HTTP 重新導向系結,將 AuthnRequest (驗證要求) 元素傳遞至 Microsoft Entra ID (識別提供者)。 Microsoft Entra ID,然後使用 HTTP post 系結將 Response 項目張貼至雲端服務。

單一 Sign-On (SSO) 工作流程的螢幕快照。

注意

本文討論如何使用 SAML 進行單一登錄。 如需其他處理單一登錄方式的詳細資訊(例如,使用 OpenID Connect 或整合式 Windows 驗證),請參閱在 Microsoft Entra ID中 單一登錄應用程式。

AuthnRequest

若要要求使用者驗證,雲端服務會將 AuthnRequest 項目傳送至Microsoft Entra ID。 範例 SAML 2.0 AuthnRequest 看起來可能像下列範例:

<samlp:AuthnRequest
  xmlns="urn:oasis:names:tc:SAML:2.0:metadata"
  ID="C2dE3fH4iJ5kL6mN7oP8qR9sT0uV1w"
  Version="2.0" IssueInstant="2013-03-18T03:28:54.1839884Z"
  xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol">
  <Issuer xmlns="urn:oasis:names:tc:SAML:2.0:assertion">https://www.contoso.com</Issuer>
</samlp:AuthnRequest>
參數 類型 描述
ID 必填 Microsoft Entra ID 會使用這個屬性填入傳回回應的 InResponseTo 屬性。 標識元不得以數字開頭,因此常見的策略是在 GUID 的字串表示前面加上字串,例如 「ID」。 例如,id6c1c178c166d486687be4aaf5e482730 是有效的標識符。
Version 必填 此參數應設定為 2.0
IssueInstant 必填 這是具有UTC值和 來回格式 (“o”)的DateTime字串。 Microsoft Entra ID 預期此類型的 DateTime 值,但不會評估或使用該值。
AssertionConsumerServiceURL 自選 如果提供,此參數必須符合 Microsoft Entra 識別碼中的雲端服務 RedirectUri
ForceAuthn 自選 這是布爾值。 如果為 true,表示使用者將強制重新驗證,即使他們具有具有Microsoft Entra ID 的有效會話也一樣。
IsPassive 自選 這是布爾值,指定Microsoft Entra ID 是否應該以無訊息方式驗證使用者,而不需用戶互動,如果會話 Cookie 存在的話。 如果這是真的,Microsoft Entra ID 會嘗試使用會話 Cookie 驗證使用者。

所有其他 AuthnRequest 屬性,例如 ConsentDestinationAssertionConsumerServiceIndexAttributeConsumerServiceIndexProviderName都會忽略 。

Microsoft Entra ID 也會忽略 AuthnRequest中的 Conditions 專案。

發行

AuthnRequest 中的 Issuer 元素必須完全符合 Microsoft Entra ID 之雲端服務中的其中一個 ServicePrincipalNames。 一般而言,這會設定為應用程式註冊期間所指定的 應用程式標識碼 URI

包含 Issuer 元素的 SAML 摘錄看起來像下列範例:

<Issuer xmlns="urn:oasis:names:tc:SAML:2.0:assertion">https://www.contoso.com</Issuer>

NameIDPolicy

此元素會在回應中要求特定名稱標識碼格式,而且在傳送 Microsoft至 entra ID 的 AuthnRequest 元素中是選擇性的。

NameIdPolicy 元素看起來會像下列範例:

<NameIDPolicy Format="urn:oasis:names:tc:SAML:2.0:nameid-format:persistent"/>

如果提供 NameIDPolicy,您可以包含其選擇性 Format 屬性。 Format 屬性只能有下列其中一個值:任何其他值都會導致錯誤。

  • urn:oasis:names:tc:SAML:2.0:nameid-format:persistent:Microsoft Entra ID 會發出 NameID 宣告做為成對標識符。
  • urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress:Microsoft Entra ID 會以電子郵件地址格式發出 NameID 宣告。
  • urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified:這個值允許Microsoft Entra ID 選取宣告格式。 Microsoft Entra ID 會發出 NameID 宣告做為成對標識符。
  • urn:oasis:names:tc:SAML:2.0:nameid-format:transient:Microsoft Entra ID 會發出 NameID 宣告,做為目前 SSO 作業唯一的隨機產生值。 這表示值是暫時的,無法用來識別驗證使用者。

如果指定了 SPNameQualifier,Microsoft Entra 標識碼會在回應中包含相同的 SPNameQualifier

Microsoft Entra ID 會忽略 AllowCreate 屬性。

RequestedAuthnContext

RequestedAuthnContext 元素會指定所需的驗證方法。 在傳送 Microsoft 至 entra ID 的 AuthnRequest 元素中,這是選擇性的。

注意

如果 SAML 要求包含 RequestedAuthnContext,則必須將 Comparison 元素設定為 exact

Microsoft Entra ID 支援下列 AuthnContextClassRef 值。

驗證方法 驗證內容類別 URI
Kerberos urn:oasis:names:tc:SAML:2.0:ac:classes:Kerberos
用戶名稱和密碼 urn:oasis:names:tc:SAML:2.0:ac:classes:Password
PGP 公鑰基礎結構 urn:oasis:names:tc:SAML:2.0:ac:classes:PGP
安全遠端密碼 urn:oasis:names:tc:SAML:2.0:ac:classes:SecureRemotePassword
XML 數字簽名 urn:oasis:names:tc:SAML:2.0:ac:classes:XMLDSig
簡單的公鑰基礎結構 urn:oasis:names:tc:SAML:2.0:ac:classes:SPKI
智慧卡 urn:oasis:names:tc:SAML:2.0:ac:classes:Smartcard
具有封閉私鑰和 PIN 的智慧卡 urn:oasis:names:tc:SAML:2.0:ac:classes:SmartcardPKI
傳輸層安全性 (TLS) 用戶端 urn:oasis:names:tc:SAML:2.0:ac:classes:TLSClient
未指定 urn:oasis:names:tc:SAML:2.0:ac:classes:Unspecified
X.509 憑證 urn:oasis:names:tc:SAML:2.0:ac:classes:X509
整合式 Windows 驗證 urn:federation:authentication:windows

範圍

包含識別提供者清單的 Scoping 元素在傳送 Microsoft至 entra ID 的 AuthnRequest 元素中是選擇性的。

如果提供,請勿包含 ProxyCount 屬性、IDPListOptionRequesterID 元素,因為不支持它們。

簽名

AuthnRequest 專案中的 Signature 項目是選擇性的。 Microsoft Entra 識別碼可以設定為強制執行已簽署驗證要求的需求。 如果已啟用,則只會接受已簽署的驗證要求,否則只會回應已註冊的判斷提示取用者服務 URL 來提供要求者驗證。

主題

請勿包含 Subject 專案。 Microsoft Entra ID 不支援在 AuthnRequest 中指定主旨,如果提供主旨,則會傳回錯誤。

您可以改為將 login_hint 參數新增至單一登錄 URL 的 HTTP 要求,並將主體的 NameID 當做參數值來提供主體。

回應

當要求的登入成功完成時,Microsoft Entra ID 會張貼雲端服務的回應。 成功登入嘗試的回應如下所示:

<samlp:Response ID="_a4958bfd-e107-4e67-b06d-0d85ade2e76a" Version="2.0" IssueInstant="2013-03-18T07:38:15.144Z" Destination="https://contoso.com/identity/inboundsso.aspx" InResponseTo="C2dE3fH4iJ5kL6mN7oP8qR9sT0uV1w" xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol">
  <Issuer xmlns="urn:oasis:names:tc:SAML:2.0:assertion"> https://login.microsoftonline.com/aaaabbbb-0000-cccc-1111-dddd2222eeee/</Issuer>
  <ds:Signature xmlns:ds="https://www.w3.org/2000/09/xmldsig#">
    ...
  </ds:Signature>
  <samlp:Status>
    <samlp:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:Success" />
  </samlp:Status>
  <Assertion ID="_bf9c623d-cc20-407a-9a59-c2d0aee84d12" IssueInstant="2013-03-18T07:38:15.144Z" Version="2.0" xmlns="urn:oasis:names:tc:SAML:2.0:assertion">
    <Issuer>https://login.microsoftonline.com/aaaabbbb-0000-cccc-1111-dddd2222eeee/</Issuer>
    <ds:Signature xmlns:ds="https://www.w3.org/2000/09/xmldsig#">
      ...
    </ds:Signature>
    <Subject>
      <NameID>Uz2Pqz1X7pxe4XLWxV9KJQ+n59d573SepSAkuYKSde8=</NameID>
      <SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer">
        <SubjectConfirmationData InResponseTo="id758d0ef385634593a77bdf7e632984b6" NotOnOrAfter="2013-03-18T07:43:15.144Z" Recipient="https://contoso.com/identity/inboundsso.aspx" />
      </SubjectConfirmation>
    </Subject>
    <Conditions NotBefore="2013-03-18T07:38:15.128Z" NotOnOrAfter="2013-03-18T08:48:15.128Z">
      <AudienceRestriction>
        <Audience>https://www.contoso.com</Audience>
      </AudienceRestriction>
    </Conditions>
    <AttributeStatement>
      <Attribute Name="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name">
        <AttributeValue>testuser@contoso.com</AttributeValue>
      </Attribute>
      <Attribute Name="http://schemas.microsoft.com/identity/claims/objectidentifier">
        <AttributeValue>3F2504E0-4F89-11D3-9A0C-0305E82C3301</AttributeValue>
      </Attribute>
      ...
    </AttributeStatement>
    <AuthnStatement AuthnInstant="2013-03-18T07:33:56.000Z" SessionIndex="_bf9c623d-cc20-407a-9a59-c2d0aee84d12">
      <AuthnContext>
        <AuthnContextClassRef> urn:oasis:names:tc:SAML:2.0:ac:classes:Password</AuthnContextClassRef>
      </AuthnContext>
    </AuthnStatement>
  </Assertion>
</samlp:Response>

回應

Response 專案包含授權要求的結果。 Microsoft Entra ID 會設定 Response 專案中 IDVersionIssueInstant 值。 它也會設定下列屬性:

  • Destination:登入成功完成時,這會設定為服務提供者(雲端服務)的 RedirectUri
  • InResponseTo:這會設定為起始回應之 AuthnRequest 專案的 ID 屬性。

發行

Microsoft Entra ID 會將 Issuer 項目設定為 https://sts.windows.net/<TenantIDGUID>/,其中 <TenantIDGUID> 是 entra 租使用者的租 Microsoft用戶標識符。

例如,具有Issuer元素的回應看起來可能類似下列範例:

<Issuer xmlns="urn:oasis:names:tc:SAML:2.0:assertion"> https://sts.windows.net/aaaabbbb-0000-cccc-1111-dddd2222eeee/</Issuer>

地位

Status 元素會傳達登入的成功或失敗。 它包含 StatusCode 專案,其中包含程式代碼或一組巢狀程序代碼,代表要求的狀態。 它也包含 StatusMessage 元素,其中包含登入程式期間產生的自定義錯誤訊息。

下列範例是 SAML 回應,以嘗試登入失敗。

<samlp:Response ID="_f0961a83-d071-4be5-a18c-9ae7b22987a4" Version="2.0" IssueInstant="2013-03-18T08:49:24.405Z" InResponseTo="iddce91f96e56747b5ace6d2e2aa9d4f8c" xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol">
  <Issuer xmlns="urn:oasis:names:tc:SAML:2.0:assertion">https://sts.windows.net/aaaabbbb-0000-cccc-1111-dddd2222eeee/</Issuer>
  <samlp:Status>
    <samlp:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:Requester">
      <samlp:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:RequestUnsupported" />
    </samlp:StatusCode>
    <samlp:StatusMessage>AADSTS75006: An error occurred while processing a SAML2 Authentication request. AADSTS90011: The SAML authentication request property 'NameIdentifierPolicy/SPNameQualifier' is not supported.
    Trace ID: 0000aaaa-11bb-cccc-dd22-eeeeee333333
    Timestamp: 2013-03-18 08:49:24Z</samlp:StatusMessage>
    </samlp:Status>
</samlp:Response>

斷言

除了 IDIssueInstantVersion之外,Microsoft Entra ID 也會在回應的 Assertion 元素中設定下列元素。

發行

這會設定為 https://sts.windows.net/<TenantIDGUID>/其中 <TenantIDGUID> 是 Microsoft Entra 租使用者的租用戶標識碼。

<Issuer>https://sts.windows.net/aaaabbbb-0000-cccc-1111-dddd2222eeee/</Issuer>

簽名

Microsoft Entra ID 會簽署判斷提示,以回應成功的登入。 Signature 元素包含數位簽名,雲端服務可用來驗證來源來驗證判斷提示的完整性。

若要產生此數字簽名,Microsoft Entra ID 會在其元數據檔的 IDPSSODescriptor 元素中使用簽署金鑰。

<ds:Signature xmlns:ds="https://www.w3.org/2000/09/xmldsig#">
  digital_signature_here
</ds:Signature>

主題

這會指定判斷提示中語句主體的原則。 它包含 NameID 專案,代表已驗證的使用者。 NameID 值是目標標識符,只會導向至令牌物件之服務提供者。 它是持續性的 - 它可以撤銷,但永遠不會重新指派。 它也不透明,因為它不會顯示使用者的任何專案,而且不能當做屬性查詢的標識碼使用。

SubjectConfirmation 項目的 Method 屬性一律設定為 urn:oasis:names:tc:SAML:2.0:cm:bearer

<Subject>
  <NameID>Uz2Pqz1X7pxe4XLWxV9KJQ+n59d573SepSAkuYKSde8=</NameID>
  <SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer">
    <SubjectConfirmationData InResponseTo="id758d0ef385634593a77bdf7e632984b6" NotOnOrAfter="2013-03-18T07:43:15.144Z" Recipient="https://contoso.com/identity/inboundsso.aspx" />
  </SubjectConfirmation>
</Subject>

條件

這個專案會指定條件,以定義可接受的 SAML 判斷提示用法。

<Conditions NotBefore="2013-03-18T07:38:15.128Z" NotOnOrAfter="2013-03-18T08:48:15.128Z">
  <AudienceRestriction>
    <Audience>https://www.contoso.com</Audience>
  </AudienceRestriction>
</Conditions>

NotBeforeNotOnOrAfter 屬性會指定判斷提示有效的間隔。

  • NotBefore 屬性值等於或稍晚(小於一秒),而不是 Assertion 元素的 IssueInstant 屬性值。 Microsoft Entra ID 不會考慮本身與雲端服務(服務提供者)之間的任何時間差異,也不會將任何緩衝區新增至此時間。
  • NotOnOrAfter 屬性值比 NotBefore 屬性值晚 70 分鐘。

觀眾

這包含可識別預定物件的 URI。 Microsoft Entra ID 會將這個專案的值設定為起始登入之 AuthnRequestIssuer 元素的值。 若要評估 Audience 值,請使用應用程式註冊期間指定的 App ID URI 值。

<AudienceRestriction>
  <Audience>https://www.contoso.com</Audience>
</AudienceRestriction>

如同 Issuer 值,Audience 值必須完全符合其中一個服務主體名稱,以Microsoft Entra ID 表示雲端服務。 不過,如果 Issuer 元素的值不是 URI 值,回應中的 Audience 值會是前面加上 spn:Issuer 值。

AttributeStatement

這包含有關主體或使用者的宣告。 下列摘錄包含範例 AttributeStatement 專案。 省略號表示元素可以包含多個屬性和屬性值。

<AttributeStatement>
  <Attribute Name="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name">
    <AttributeValue>testuser@contoso.com</AttributeValue>
  </Attribute>
  <Attribute Name="http://schemas.microsoft.com/identity/claims/objectidentifier">
    <AttributeValue>3F2504E0-4F89-11D3-9A0C-0305E82C3301</AttributeValue>
  </Attribute>
  ...
</AttributeStatement>
  • 名稱宣告 - Name 屬性 (http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name) 的值是已驗證使用者的使用者主體名稱,例如 testuser@managedtenant.com
  • ObjectIdentifier Claim - ObjectIdentifier 屬性 (http://schemas.microsoft.com/identity/claims/objectidentifier) 的值是代表 entra ID Microsoft 中已驗證使用者的目錄物件的 ObjectIdObjectId 是固定、全域唯一且重複使用已驗證使用者的安全標識碼。

AuthnStatement

此元素會判斷提示主體在特定時間透過特定方式進行驗證。

  • AuthnInstant 屬性會指定使用者以 Microsoft Entra 識別碼進行驗證的時間。
  • AuthnContext 元素會指定用來驗證使用者的驗證內容。
<AuthnStatement AuthnInstant="2013-03-18T07:33:56.000Z" SessionIndex="_bf9c623d-cc20-407a-9a59-c2d0aee84d12">
  <AuthnContext>
    <AuthnContextClassRef> urn:oasis:names:tc:SAML:2.0:ac:classes:Password</AuthnContextClassRef>
  </AuthnContext>
</AuthnStatement>