在 Azure AD B2C 中註冊 SAML 應用程式的選項
本文說明當您將 Azure Active Directory B2C (Azure AD B2C) 與安全性判斷提示標記語言 (SAML) 應用程式連線時可用的組態選項。
開始 之前,請使用 [選擇原則類型 選取器] 來選擇您要設定的原則類型。 Azure Active Directory B2C 提供兩種方法來定義使用者如何與您的應用程式互動:透過預先 定義的使用者流程 ,或透過完全可設定 的自訂原則 。 本文中每個方法所需的步驟都不同。
此功能僅適用于自訂原則。 針對安裝步驟,請在上述選取器中選取 [自訂原則 ]。
指定 SAML 回應簽章
您可以指定要用來簽署 SAML 訊息的憑證。 訊息是 <samlp:Response>
傳送至應用程式之 SAML 回應內的 元素。
如果您還沒有原則金鑰,請 建立一個 。 然後在 SAML 權杖簽發者技術設定檔中設定 SamlMessageSigning
中繼資料專案。 StorageReferenceId
必須參考原則金鑰名稱。
<ClaimsProvider>
<DisplayName>Token Issuer</DisplayName>
<TechnicalProfiles>
<!-- SAML Token Issuer technical profile -->
<TechnicalProfile Id="Saml2AssertionIssuer">
<DisplayName>Token Issuer</DisplayName>
<Protocol Name="SAML2"/>
<OutputTokenFormat>SAML2</OutputTokenFormat>
...
<CryptographicKeys>
<Key Id="SamlMessageSigning" StorageReferenceId="B2C_1A_SamlMessageCert"/>
...
</CryptographicKeys>
...
</TechnicalProfile>
簽章演算法
您可以設定用來簽署 SAML 判斷提示的簽章演算法。 可能的值為 Sha256
、 Sha384
、 Sha512
或 Sha1
。 請確定技術設定檔和應用程式使用相同的簽章演算法。 只使用憑證支援的演算法。
使用 XmlSignatureAlgorithm
信賴憑證者 Metadata
元素內的中繼資料金鑰來設定簽章演算法。
<RelyingParty>
<DefaultUserJourney ReferenceId="SignUpOrSignIn" />
<TechnicalProfile Id="PolicyProfile">
<DisplayName>PolicyProfile</DisplayName>
<Protocol Name="SAML2"/>
<Metadata>
<Item Key="XmlSignatureAlgorithm">Sha256</Item>
</Metadata>
..
</TechnicalProfile>
</RelyingParty>
檢查 SAML 判斷提示簽章
當您的應用程式預期要簽署 SAML 判斷提示區段時,請確定 SAML 服務提供者將 設定 WantAssertionsSigned
為 true
。 如果設定為 false
或不存在,則不會簽署判斷提示區段。
下列範例顯示 SAML 服務提供者的中繼資料,並將 WantAssertionsSigned
設定為 true
。
<EntityDescriptor ID="id123456789" entityID="https://samltestapp2.azurewebsites.net" validUntil="2099-12-31T23:59:59Z" xmlns="urn:oasis:names:tc:SAML:2.0:metadata">
<SPSSODescriptor WantAssertionsSigned="true" AuthnRequestsSigned="false" protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol">
...
</SPSSODescriptor>
</EntityDescriptor>
簽章憑證
您的原則必須指定要用來簽署 SAML 回應之 SAML 判斷提示區段的憑證。 如果您還沒有原則金鑰,請 建立一個 。 然後在 SAML 權杖簽發者技術設定檔中設定 SamlAssertionSigning
中繼資料專案。 StorageReferenceId
必須參考原則金鑰名稱。
<ClaimsProvider>
<DisplayName>Token Issuer</DisplayName>
<TechnicalProfiles>
<!-- SAML Token Issuer technical profile -->
<TechnicalProfile Id="Saml2AssertionIssuer">
<DisplayName>Token Issuer</DisplayName>
<Protocol Name="SAML2"/>
<OutputTokenFormat>SAML2</OutputTokenFormat>
...
<CryptographicKeys>
<Key Id="SamlAssertionSigning" StorageReferenceId="B2C_1A_SamlMessageCert"/>
...
</CryptographicKeys>
...
</TechnicalProfile>
在 SAML 判斷提示中啟用加密
當應用程式預期 SAML 判斷提示為加密格式時,請確定已在 Azure AD B2C 原則中啟用加密。
Azure AD B2C 會使用服務提供者的公開金鑰憑證來加密 SAML 判斷提示。 公開金鑰必須存在於 SAML 應用程式的中繼資料端點 KeyDescriptor
use
中,且值設定為 Encryption
,如下列範例所示:
<KeyDescriptor use="encryption">
<KeyInfo xmlns="https://www.w3.org/2000/09/xmldsig#">
<X509Data>
<X509Certificate>valid certificate</X509Certificate>
</X509Data>
</KeyInfo>
</KeyDescriptor>
若要讓 Azure AD B2C 傳送加密判斷提示,請將信賴憑證者技術設定檔中的中繼資料專案設定 WantsEncryptedAssertion
為 true
。 您也可以設定用來加密 SAML 判斷提示的演算法。
<RelyingParty>
<DefaultUserJourney ReferenceId="SignUpOrSignIn" />
<TechnicalProfile Id="PolicyProfile">
<DisplayName>PolicyProfile</DisplayName>
<Protocol Name="SAML2"/>
<Metadata>
<Item Key="WantsEncryptedAssertions">true</Item>
</Metadata>
..
</TechnicalProfile>
</RelyingParty>
加密方法
若要設定用來加密 SAML 判斷提示資料的加密方法,請在信賴憑證者內設定 DataEncryptionMethod
中繼資料金鑰。 可能的值為 Aes256
(預設值)、、 Aes192
Sha512
、 或 Aes128
。 中繼資料會控制 SAML 回應中的專案值 <EncryptedData>
。
若要設定加密方法,以加密用來加密 SAML 判斷提示資料的金鑰複本,請在信賴憑證者內設定 KeyEncryptionMethod
中繼資料金鑰。 可能的值包括:
Rsa15
(預設值):RSA 公開金鑰密碼編譯標準 (PKCS) 1.5 版演算法。RsaOaep
:RSA 最佳非對稱加密填補 (OAEP) 加密演算法。
中繼資料會控制 SAML 回應中的專案值 <EncryptedKey>
。
下列範例顯示 EncryptedAssertion
SAML 判斷提示的 區段。 加密的資料方法是 Aes128
,而加密金鑰方法是 Rsa15
。
<saml:EncryptedAssertion>
<xenc:EncryptedData xmlns:xenc="http://www.w3.org/2001/04/xmlenc#"
xmlns:dsig="http://www.w3.org/2000/09/xmldsig#" Type="http://www.w3.org/2001/04/xmlenc#Element">
<xenc:EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#aes128-cbc" />
<dsig:KeyInfo>
<xenc:EncryptedKey>
<xenc:EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-1_5" />
<xenc:CipherData>
<xenc:CipherValue>...</xenc:CipherValue>
</xenc:CipherData>
</xenc:EncryptedKey>
</dsig:KeyInfo>
<xenc:CipherData>
<xenc:CipherValue>...</xenc:CipherValue>
</xenc:CipherData>
</xenc:EncryptedData>
</saml:EncryptedAssertion>
您可以變更加密判斷提示的格式。 若要設定加密格式,請在信賴憑證者內設定 UseDetachedKeys
中繼資料金鑰。 可能的值: true
或 false
(預設值)。 當值設定為 true
時,卸離金鑰會將加密判斷提示新增為 的子 EncryptedAssertion
系,而不是 EncryptedData
。
使用信賴憑證者技術設定檔 內的 中繼資料金鑰來設定加密方法和格式:
<RelyingParty>
<DefaultUserJourney ReferenceId="SignUpOrSignIn" />
<TechnicalProfile Id="PolicyProfile">
<DisplayName>PolicyProfile</DisplayName>
<Protocol Name="SAML2"/>
<Metadata>
<Item Key="DataEncryptionMethod">Aes128</Item>
<Item Key="KeyEncryptionMethod">Rsa15</Item>
<Item Key="UseDetachedKeys">false</Item>
</Metadata>
..
</TechnicalProfile>
</RelyingParty>
設定 IdP 起始的流程
當應用程式預期收到 SAML 判斷提示而不先將 SAML AuthN 要求傳送至識別提供者 (IdP)時,您必須為 IdP 起始的流程設定 Azure AD B2C。
在 IdP 起始的流程中,識別提供者 (Azure AD B2C) 會啟動登入程式。 識別提供者會將未經請求的 SAML 回應傳送給服務提供者(您的信賴憑證者應用程式)。
我們目前不支援起始識別提供者是與 Azure AD B2C 同盟的外部識別提供者,例如 Active Directory 同盟服務 或 Salesforce 的案例。 只有 Azure AD B2C 中的本機帳戶驗證才支援 IdP 起始的流程。
若要啟用 IdP 起始的流程,請將 IdpInitiatedProfileEnabled
信賴憑證者技術設定檔 中的中繼資料專案設定為 true
。
<RelyingParty>
<DefaultUserJourney ReferenceId="SignUpOrSignIn" />
<TechnicalProfile Id="PolicyProfile">
<DisplayName>PolicyProfile</DisplayName>
<Protocol Name="SAML2"/>
<Metadata>
<Item Key="IdpInitiatedProfileEnabled">true</Item>
</Metadata>
..
</TechnicalProfile>
</RelyingParty>
若要透過 IdP 起始的流程登入或註冊使用者,請使用下列 URL:
https://<tenant-name>.b2clogin.com/<tenant-name>.onmicrosoft.com/<policy-name>/generic/login?EntityId=<app-identifier-uri>&RelayState=<relay-state>
取代下列值:
- 將 取代
<tenant-name>
為您的租使用者名稱。 - 將 取代
<policy-name>
為 SAML 信賴憑證者原則的名稱。 - 將 取代
<app-identifier-uri>
為identifierUris
中繼資料檔案中的 值,例如https://contoso.onmicrosoft.com/app-name
。 - [選擇性] 將 取代
<relay-state>
為授權要求中包含的值,此值也會在權杖回應中傳回。relay-state
參數可用來在驗證要求發生之前,在應用程式中編碼使用者狀態的相關資訊,例如他們開啟的頁面。
範例原則
您可以使用完整的範例原則來測試 SAML 測試應用程式:
- 下載 SAML-SP 起始的登入範例原則 。
- 更新
TenantId
以符合您的租使用者名稱。 本文使用 範例 contoso.b2clogin.com 。 - 保留原則名稱 B2C_1A_signup_signin_saml 。
設定 SAML 回應存留期
您可以設定 SAML 回應維持有效的時間長度。 使用 TokenLifeTimeInSeconds
SAML 權杖簽發者技術設定檔內的中繼資料專案來設定存留期。 此值是從時間戳記中經過 NotBefore
的秒數,在權杖發行時間計算。 預設存留期為 300 秒(五分鐘)。
<ClaimsProvider>
<DisplayName>Token Issuer</DisplayName>
<TechnicalProfiles>
<TechnicalProfile Id="Saml2AssertionIssuer">
<DisplayName>Token Issuer</DisplayName>
<Protocol Name="SAML2"/>
<OutputTokenFormat>SAML2</OutputTokenFormat>
<Metadata>
<Item Key="TokenLifeTimeInSeconds">400</Item>
</Metadata>
...
</TechnicalProfile>
設定 SAML 回應的時間扭曲
您可以設定套用至 SAML 回應 NotBefore
時間戳記的時間扭曲。 此設定可確保如果兩個平臺之間的時間未同步,SAML 判斷提示在這段時間扭曲時仍會被視為有效。
使用 TokenNotBeforeSkewInSeconds
SAML 權杖簽發者技術設定檔內的中繼資料專案來設定時間扭曲。 扭曲值是以秒為單位,預設值為 0。 最大值為 3600 (一小時)。
例如,當 設定為 120
秒: TokenNotBeforeSkewInSeconds
- 權杖會在 UTC 13:05:10 發出。
- 權杖的有效時間是從 13:03:10 UTC。
<ClaimsProvider>
<DisplayName>Token Issuer</DisplayName>
<TechnicalProfiles>
<TechnicalProfile Id="Saml2AssertionIssuer">
<DisplayName>Token Issuer</DisplayName>
<Protocol Name="SAML2"/>
<OutputTokenFormat>SAML2</OutputTokenFormat>
<Metadata>
<Item Key="TokenNotBeforeSkewInSeconds">120</Item>
</Metadata>
...
</TechnicalProfile>
從日期和時間移除毫秒
您可以指定是否要從 SAML 回應內的日期和時間值中移除毫秒。 (這些值包括 IssueInstant
、 NotBefore
NotOnOrAfter
和 AuthnInstant
。若要移除毫秒,請在信賴憑證者內設定 RemoveMillisecondsFromDateTime
中繼資料金鑰。 可能的值: false
(預設值)或 true
。
<RelyingParty>
<DefaultUserJourney ReferenceId="SignUpOrSignIn" />
<TechnicalProfile Id="PolicyProfile">
<DisplayName>PolicyProfile</DisplayName>
<Protocol Name="SAML2" />
<Metadata>
<Item Key="RemoveMillisecondsFromDateTime">true</Item>
</Metadata>
<OutputClaims>
...
</OutputClaims>
<SubjectNamingInfo ClaimType="objectId" ExcludeAsClaim="true" />
</TechnicalProfile>
</RelyingParty>
使用簽發者識別碼覆寫簽發者 URI
如果您有多個相依于不同 entityID
值的 SAML 應用程式,則可以覆寫 IssuerUri
信賴憑證者檔案中的值。 若要覆寫簽發者 URI,請從基底檔案複製識別碼的技術 Saml2AssertionIssuer
設定檔,並覆寫 IssuerUri
值。
提示
從基底複製 區 <ClaimsProviders>
段,並在宣告提供者內保留這些專案: <DisplayName>Token Issuer</DisplayName>
、 <TechnicalProfile Id="Saml2AssertionIssuer">
和 <DisplayName>Token Issuer</DisplayName>
。
範例:
<ClaimsProviders>
<ClaimsProvider>
<DisplayName>Token Issuer</DisplayName>
<TechnicalProfiles>
<TechnicalProfile Id="Saml2AssertionIssuer">
<DisplayName>Token Issuer</DisplayName>
<Metadata>
<Item Key="IssuerUri">customURI</Item>
</Metadata>
</TechnicalProfile>
</TechnicalProfiles>
</ClaimsProvider>
</ClaimsProviders>
<RelyingParty>
<DefaultUserJourney ReferenceId="SignUpInSAML" />
<TechnicalProfile Id="PolicyProfile">
<DisplayName>PolicyProfile</DisplayName>
<Protocol Name="SAML2" />
<Metadata>
…
管理會話
您可以使用 元素和 SamlSSOSessionProvider 來管理 Azure AD B2C 與 SAML 信賴憑證者應用程式 UseTechnicalProfileForSessionManagement
之間的會話。
強制使用者重新驗證
若要強制使用者重新驗證,應用程式可以在 ForceAuthn
SAML 驗證要求中包含 屬性。 屬性 ForceAuthn
是布林值。 當它設定為 true
時,使用者的會話將會在 Azure AD B2C 失效,且使用者被迫重新驗證。
下列 SAML 驗證要求示範如何將 屬性設定 ForceAuthn
為 true
。
<samlp:AuthnRequest
Destination="https://contoso.b2clogin.com/contoso.onmicrosoft.com/B2C_1A_SAML2_signup_signin/samlp/sso/login"
ForceAuthn="true" ...>
...
</samlp:AuthnRequest>
簽署 Azure AD B2C IdP SAML 中繼資料
如果應用程式需要,您可以指示 Azure AD B2C 簽署其 SAML 識別提供者的元資料檔案。 如果您還沒有原則金鑰,請 建立一個 。 然後在 SAML 權杖簽發者技術設定檔中設定 MetadataSigning
中繼資料專案。 StorageReferenceId
必須參考原則金鑰名稱。
<ClaimsProvider>
<DisplayName>Token Issuer</DisplayName>
<TechnicalProfiles>
<!-- SAML Token Issuer technical profile -->
<TechnicalProfile Id="Saml2AssertionIssuer">
<DisplayName>Token Issuer</DisplayName>
<Protocol Name="SAML2"/>
<OutputTokenFormat>SAML2</OutputTokenFormat>
...
<CryptographicKeys>
<Key Id="MetadataSigning" StorageReferenceId="B2C_1A_SamlMetadataCert"/>
...
</CryptographicKeys>
...
</TechnicalProfile>
對 SAML 通訊協定進行偵錯
若要協助設定及偵錯與服務提供者的整合,您可以使用 SAML 通訊協定的瀏覽器擴充功能。 瀏覽器延伸模組包括適用于 Chrome 的 SAML DevTools 擴充功能、 適用于 Firefox 的 SAML 追蹤器,以及 適用于 Edge 或 Internet Explorer 的 開發人員工具。
使用這些工具,您可以檢查應用程式與 Azure AD B2C 之間的整合。 例如:
- 檢查 SAML 要求是否包含簽章,並判斷用來登入授權要求的演算法。
- 檢查 Azure AD B2C 是否傳回錯誤訊息。
- 檢查判斷提示區段是否已加密。
下一步
- 在 OASIS 網站上 尋找 SAML 通訊協定 的詳細資訊。
- 從 Azure AD B2C GitHub 社群存放庫 取得 SAML 測試 Web 應用程式。