設定 Azure Active Directory B2C 中的工作階段行為
開始之前,使用 [選擇原則類型] 選取器來選擇您要設定的原則類型。 Azure Active Directory B2C 提供兩種方法來定義使用者如何與您的應用程式互動:透過預先定義的使用者流程,或透過完全可設定的自訂原則。 本文中需要的步驟會因每個方法而異。
單一登入 (SSO) 可在使用者登入 Azure Active Directory B2C (Azure AD B2C) 中的應用程式時,提升安全性與便利性。 本文描述 Azure AD B2C 中使用的單一登入方法,並協助您在設定原則時,選擇最適當的 SSO 方法。
有了單一登入,使用者只要使用單一帳戶登入一次,即可存取多個應用程式。 應用程式可以是 Web 應用程式、行動裝置應用程式或單頁應用程式,且不限平台或網域名稱。
當使用者一開始登入應用程式時,Azure AD B2C 會保存 Cookie 為主的工作階段。 在後續的驗證要求中,Azure AD B2C 會讀取並驗證 Cookie 為主的工作階段,並在不提示使用者重新登入的情況下,發出存取權杖。 若以 Cookie 為主的工作階段過期或失效,使用者會收到重新登入的提示。
必要條件
- 建立使用者流程,讓使用者能夠註冊並登入您的應用程式。
- 註冊 Web 應用程式。
Azure AD B2C 工作階段概觀
與 Azure AD B2C 的整合牽涉到三種類型的 SSO 工作階段:
- Azure AD B2C - Azure AD B2C 管理的工作階段
- 同盟識別提供者 - 由識別提供者管理的工作階段,例如 Facebook、Salesforce 或 Microsoft 帳戶
- 應用程式 - Web 應用程式、行動裝置應用程式或單頁應用程式所管理的工作階段
Azure AD B2C 工作階段
當使用者使用本機或社交帳戶成功驗證時,Azure AD B2C 會將 Cookie 為主的工作階段儲存於使用者的瀏覽器上。 該 Cookie 會儲存於 Azure AD B2C 租用戶網域名稱下,例如 https://contoso.b2clogin.com
。
若使用者一開始以同盟帳戶登入,然後在工作階段時間範圍 (存留時間,TTL) 內登入相同應用程式或不同應用程式,Azure AD B2C 會嘗試向同盟識別提供者取得新的存取權杖。 若同盟識別提供者工作階段已過期或失效,同盟識別提供者會提示使用者提供其認證。 若工作階段仍在使用中 (或是使用者已使用本機帳戶而非同盟帳戶登入),Azure AD B2C 會授權使用者並排除進一步的提示。
您可以設定工作階段行為,包括工作階段 TTL,以及 Azure AD B2C 如何跨原則與應用程式共用工作階段。
同盟識別提供者工作階段
社交或企業識別提供者會管理自己的工作階段。 該 Cookie 會儲存於識別提供者的網域名稱下,例如 https://login.salesforce.com
。 Azure AD B2C 不會控制同盟識別提供者工作階段。 相反地,工作階段行為會由同盟識別提供者決定。
請考慮下列案例:
- 使用者登入 Facebook 以檢查其摘要。
- 之後,使用者開啟您的應用程式,並開始登入流程。 應用程式會將使用者重新導向至 Azure AD B2C 以完成登入流程。
- 在 Azure AD B2C 註冊或登入頁面上,使用者選擇使用其 Facebook 帳戶登入。 使用者會重新導向至 Facebook。 若 Facebook 上有使用中的工作階段,則不會提示使用者提供其認證,而是立即以 Facebook 權杖將其重新導向至 Azure AD B2C。
應用程式工作階段
可以使用 OAuth2 存取權杖、識別碼權杖或 SAML 權杖來保護 Web 應用程式、行動裝置應用程式或單頁應用程式。 當使用者嘗試存取應用程式上的受保護資源時,該應用程式會檢查應用程式端是否有使用中的工作階段。 若沒有任何應用程式工作階段或工作階段已過期,應用程式則會讓使用者前往 Azure AD B2C 登入頁面。
應用程式工作階段可能是儲存於應用程式網域名稱下之 Cookie 為主的工作階段,例如 https://contoso.com
。 行動裝置應用程式可能會以不同的方式儲存工作階段,但使用類似的方法。
設定 Azure AD B2C 工作階段行為
您可以設定 Azure AD B2C 工作階段行為,包括:
Web 應用程式工作階段存留期 (分鐘) - 驗證成功之後,Azure AD B2C 工作階段 Cookie 儲存在使用者瀏覽器的時間長度。 工作階段存留期最多可以設定為 24 小時。
Web 應用程式工作階段逾時 - 指出工作階段存留期設定或「讓我保持登入 (KMSI)」設定如何延長工作階段。
- 累積 - 指出每次使用者執行 Cookie 為主的驗證時,都會延長工作階段 (預設)。
- 絕對 - 指出在指定期間之後,會強制使用者重新驗證。
單一登入設定 - 可以使用下列範圍設定 Azure AD B2C 工作階段:
- Tenant - 這項設定是預設值。 此設定可允許 B2C 租用戶中的多個應用程式和使用者流程共用同一個使用者工作階段。 例如,使用者登入應用程式之後,就可以在存取另一個應用程式時無縫登入。
- 應用程式 - 這項設定可讓您保留應用程式專用的使用者工作階段,不受其他應用程式所限制。 例如,無論使用者是否已登入 Contoso Groceries,您都要讓使用者登入 Contoso Pharmacy,就可以使用此設定。
- 原則 - 這項設定可讓您保留使用者流程專用的使用者工作階段,不論使用該使用者工作階段的應用程式為何。 例如,若使用者已登入並完成多重要素驗證 (MFA) 步驟,只要繫結至使用者流程的工作階段未過期,就可以允許使用者存取多個應用程式較高安全性的部分。
- 抑制 - 此設定強制使用者在每次執行原則時,都必須執行整個使用者流程。
設定使用者流程
若要在使用者流程中設定工作階段行為,請遵循下列步驟:
- 登入 Azure 入口網站。
- 確定您使用的目錄包含您的 Azure AD B2C 租用戶。 選取入口網站工具列中的目錄 + 訂閱圖示。
- 在 [入口網站設定] | [目錄 + 訂用帳戶] 頁面上,在 [目錄名稱] 清單中尋找您的 Azure AD B2C 目錄,然後選取 [切換]。
- 選擇 Azure 入口網站左上角的 [所有服務],然後搜尋並選取 [Azure AD B2C]。
- 選取 [使用者流程]。
- 開啟您先前建立的使用者流程。
- 選取 [屬性] 。
- 視需要設定 [Web 應用程式工作階段存留期 (分鐘)]、[Web 應用程式工作階段逾時]、[單一登入設定] 及 [登出要求中需要識別碼權杖]。
- 按一下 [儲存]。
設定自訂原則
若要在自訂原則中設定工作階段行為,請遵循下列步驟:
開啟信賴憑證者 (RP) 檔案,例如 SignUpOrSignin.xml
如果該檔案還不存在,請將下列
<UserJourneyBehaviors>
元素新增至<RelyingParty>
元素。 它必須緊接在<DefaultUserJourney ReferenceId="UserJourney Id"/>
之後。<UserJourneyBehaviors> <SingleSignOn Scope="Application" /> <SessionExpiryType>Absolute</SessionExpiryType> <SessionExpiryInSeconds>86400</SessionExpiryInSeconds> </UserJourneyBehaviors>
新增使用者旅程行為元素之後,
RelyingParty
元素看起來應該會像下列範例所示:<RelyingParty> <DefaultUserJourney ReferenceId="SignUpOrSignIn" /> <UserJourneyBehaviors> <SingleSignOn Scope="Application" /> <SessionExpiryType>Absolute</SessionExpiryType> <SessionExpiryInSeconds>86400</SessionExpiryInSeconds> </UserJourneyBehaviors> <TechnicalProfile Id="PolicyProfile"> <DisplayName>PolicyProfile</DisplayName> <Protocol Name="OpenIdConnect" /> <OutputClaims> <OutputClaim ClaimTypeReferenceId="displayName" /> <OutputClaim ClaimTypeReferenceId="givenName" /> ... </OutputClaims> <SubjectNamingInfo ClaimType="sub" /> </TechnicalProfile> </RelyingParty>
將
Scope
屬性的值變更為Suppressed
、Tenant
、Application
或Policy
中一個可能的值。 如需詳細資訊,請參閱 RelyingParty 參考文章。請將
SessionExpiryType
元素設定為Rolling
或Absolute
。 如需詳細資訊,請參閱 RelyingParty 參考文章。將
SessionExpiryInSeconds
元素設定為介於 900 秒 (15 分鐘) 和 86,400 秒 (24 小時) 之間的數值。 如需詳細資訊,請參閱 RelyingParty 參考文章。
啟用「讓我保持登入 (KMSI)」
您可以為 Azure AD B2C 目錄中具有本機帳戶之 Web 應用程式與原生應用程式的使用者啟用 KMSI 功能。 啟用該功能後,使用者可以選擇維持在登入狀態,讓工作階段在關閉瀏覽器後仍保持使用中。 維持工作階段的方法是設定永續性 Cookie。 選取 KMSI 的使用者可以重新開啟瀏覽器,而不會收到重新輸入其使用者名稱與密碼的提示。 當使用者登出時,會撤銷此存取 (永續性 Cookie)。如需詳細資訊,請查看即時示範。
KMSI 可在個別使用者流程層級中進行設定。 為您的使用者流程啟用 KMSI 之前,請先考慮下列事項:
- 只有建議的註冊與登入 (SUSI) 版本、登入及設定檔編輯使用者流程,才支援 KMSI。 若您目前有這些使用者流程的標準 (舊版) 或 舊版預覽 - v2 版本,而且想要啟用 KMSI,則必須建立這些使用者流程的全新建議版本。
- 密碼重設或註冊使用者流程不支援 KMSI。
- 若您想要為您租用戶中的所有應用程式啟用 KMSI,建議您針對租用戶中的所有使用者流程啟用 KMSI。 因為使用者在工作階段期間可以看到多個原則,所以可能會遇到未啟用 KMSI 的原則,從工作階段中移除 KMSI Cookie。
- KMSI 不應該在公用電腦上啟用。
針對使用者流程設定 KMSI
若要為您的使用者流程啟用 KMSI:
登入 Azure 入口網站。
確定您使用的目錄包含您的 Azure AD B2C 租用戶。 選取入口網站工具列中的目錄 + 訂閱圖示。
在 [入口網站設定] | [目錄 + 訂用帳戶] 頁面上,在 [目錄名稱] 清單中尋找您的 Azure AD B2C 目錄,然後選取 [切換]。
選擇 Azure 入口網站左上角的 [所有服務],然後搜尋並選取 [Azure AD B2C]。
選取 [使用者流程 (原則)]。
開啟您先前建立的使用者流程。
選取 [屬性] 。
在 [工作階段行為] 下,選取 [Enable keep me signed in session] \(啟用讓我保持登入工作階段\)。 在 [Keep me signed in session (days)] \(讓我保持登入工作階段 (天)\) 旁輸入 1 到 90 的值,以指定工作階段可以保持開啟的天數。
使用者應該不要在公用電腦上啟用此選項。
設定頁面識別碼
若要啟用 KMSI,請將內容定義 DataUri
元素設定為頁面識別碼unifiedssp
與頁面版本1.1.0 或更新版本。
開啟原則的擴充檔案。 例如:
SocialAndLocalAccounts/
TrustFrameworkExtensions.xml
。 此延伸模組檔案是包含在自訂原則入門套件的其中一個原則檔案,您應該已在必要條件開始使用自訂原則中取得該檔案。搜尋 BuildingBlocks 元素。 如果此元素不存在,請加以新增。
將 ContentDefinitions 元素新增至原則的 BuildingBlocks 元素。
您的自訂原則應如下列程式碼片段所示:
<BuildingBlocks> <ContentDefinitions> <ContentDefinition Id="api.signuporsignin"> <DataUri>urn:com:microsoft:aad:b2c:elements:unifiedssp:1.1.0</DataUri> </ContentDefinition> </ContentDefinitions> </BuildingBlocks>
將中繼資料新增至自我判斷技術設定檔
若要將 KMSI 核取方塊新增至註冊與登入頁面,請將 setting.enableRememberMe
中繼資料設定為 true。 覆寫延伸模組檔案中的 SelfAsserted-LocalAccountSignin-Email 技術設定檔。
- 尋找 ClaimsProviders 元素。 如果此元素不存在,請加以新增。
- 請將下列宣告提供者新增至 ClaimsProviders 元素:
<ClaimsProvider>
<DisplayName>Local Account</DisplayName>
<TechnicalProfiles>
<TechnicalProfile Id="SelfAsserted-LocalAccountSignin-Email">
<Metadata>
<Item Key="setting.enableRememberMe">True</Item>
</Metadata>
</TechnicalProfile>
</TechnicalProfiles>
</ClaimsProvider>
- 儲存擴充檔案。
設定信賴憑證者檔案
更新信賴憑證者 (RP) 檔案,此檔案將起始您剛才建立的使用者旅程圖。 keepAliveInDays 參數可讓您設定「讓我保持登入 (KMSI)」工作階段 Cookie 的保存時間長度。 例如,若您將值設定為 30,則 KMSI 工作階段 Cookie 將會保存 30 天。 值的範圍為 1 到 90 天。 將值設為 0 會關閉 KMSI 功能。
開啟您的自訂原則檔案。 例如 SignUpOrSignin.xml。
若
<UserJourneyBehaviors>
子節點尚未存在,將其新增至<RelyingParty>
節點。 該子節點必須緊接在<DefaultUserJourney ReferenceId="User journey Id" />
之後,例如:<DefaultUserJourney ReferenceId="SignUpOrSignIn" />
。新增下列節點作為
<UserJourneyBehaviors>
元素的子節點。<UserJourneyBehaviors> <SingleSignOn Scope="Tenant" KeepAliveInDays="30" /> <SessionExpiryType>Absolute</SessionExpiryType> <SessionExpiryInSeconds>1200</SessionExpiryInSeconds> </UserJourneyBehaviors>
您可以同時設定 KeepAliveInDays 和 SessionExpiryInSeconds,如此一來,在登入期間,如果使用者啟用 KMSI,就會使用 KeepAliveInDays 來設定 Cookie,若使用者沒有啟用 KMSI,則會使用 SessionExpiryInSeconds 參數中指定的值。 建議您將 SessionExpiryInSeconds 的值設定為短時間 (1200 秒),並且將 KeepAliveInDays 設定為相對長的時間 (30 天),如下列範例所示:
<RelyingParty>
<DefaultUserJourney ReferenceId="SignUpOrSignIn" />
<UserJourneyBehaviors>
<SingleSignOn Scope="Tenant" KeepAliveInDays="30" />
<SessionExpiryType>Absolute</SessionExpiryType>
<SessionExpiryInSeconds>1200</SessionExpiryInSeconds>
</UserJourneyBehaviors>
<TechnicalProfile Id="PolicyProfile">
<DisplayName>PolicyProfile</DisplayName>
<Protocol Name="OpenIdConnect" />
<OutputClaims>
<OutputClaim ClaimTypeReferenceId="displayName" />
<OutputClaim ClaimTypeReferenceId="givenName" />
<OutputClaim ClaimTypeReferenceId="surname" />
<OutputClaim ClaimTypeReferenceId="email" />
<OutputClaim ClaimTypeReferenceId="objectId" PartnerClaimType="sub"/>
<OutputClaim ClaimTypeReferenceId="identityProvider" />
<OutputClaim ClaimTypeReferenceId="tenantId" AlwaysUseDefaultValue="true" DefaultValue="{Policy:TenantObjectId}" />
</OutputClaims>
<SubjectNamingInfo ClaimType="sub" />
</TechnicalProfile>
</RelyingParty>
登出
當您想要讓使用者登出應用程式時,只清除應用程式的 Cookie 或結束使用者的工作階段並不夠。 您必須將使用者重新導向至 Azure AD B2C 以進行登出。否則,使用者可能不必再次輸入認證,就能重新驗證應用程式。
登出要求時,Azure AD B2C 會:
- 使 Azure AD B2C Cookie 為主的工作階段失效。
- 嘗試從同盟識別提供者登出。
- 使 Azure AD B2C Cookie 為主的工作階段失效。
- 嘗試從同盟識別提供者登出:
- 可選擇從其他應用程式登出。 如需詳細資訊,請參閱單一登出章節。
注意
您可以將識別提供者技術設定檔中繼資料 SingleLogoutEnabled
設定為 false
,以禁止從同盟識別提供者登出。
登出會清除使用者在 Azure AD B2C 的單一登入狀態,但可能不會將使用者登出其社交識別提供者工作階段。 若使用者在後續登入期間選取相同的識別提供者,則無須輸入自己的認證,即可重新驗證。 若使用者想要登出應用程式,不一定代表他們想要登出自己的 Facebook 帳戶。 然而,若使用本機帳戶,使用者的工作階段就會正常結束。
單一登出
當您將使用者重新導向至 Azure AD B2C 登出端點 (針對 OAuth2 與 OpenID Connect),或是傳送 LogoutRequest
(針對 SAML) 時,Azure AD B2C 會從瀏覽器中清除使用者的工作階段。 然而,使用者可能仍會登入其他使用 Azure AD B2C 進行驗證的應用程式。 若要將使用者登出具有使用中工作階段的所有應用程式,Azure AD B2C 支援「單一登出」(Single Sign-Out),也稱為「單一登出 (SLO)」(Single Log-Out)。
在登出期間,Azure AD B2C 會同時將 HTTP 要求傳送至使用者目前登入之所有應用程式的已註冊登出 URL。
設定自訂原則
若要支援單一登出,JWT 與 SAML 的權杖簽發者技術設定檔都必須指定:
- 通訊協定名稱,例如
<Protocol Name="OpenIdConnect" />
- 工作階段技術設定檔的參考,例如
UseTechnicalProfileForSessionManagement ReferenceId="SM-jwt-issuer" />
。
下列範例說明使用單一登出的 JWT 與 SAML 權杖簽發者:
<ClaimsProvider>
<DisplayName>Local Account SignIn</DisplayName>
<TechnicalProfiles>
<!-- JWT Token Issuer -->
<TechnicalProfile Id="JwtIssuer">
<DisplayName>JWT token Issuer</DisplayName>
<Protocol Name="OpenIdConnect" />
<OutputTokenFormat>JWT</OutputTokenFormat>
...
<UseTechnicalProfileForSessionManagement ReferenceId="SM-jwt-issuer" />
</TechnicalProfile>
<!-- Session management technical profile for OIDC based tokens -->
<TechnicalProfile Id="SM-jwt-issuer">
<DisplayName>Session Management Provider</DisplayName>
<Protocol Name="Proprietary" Handler="Web.TPEngine.SSO.OAuthSSOSessionProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
</TechnicalProfile>
<!--SAML token issuer-->
<TechnicalProfile Id="Saml2AssertionIssuer">
<DisplayName>SAML token issuer</DisplayName>
<Protocol Name="SAML2" />
<OutputTokenFormat>SAML2</OutputTokenFormat>
...
<UseTechnicalProfileForSessionManagement ReferenceId="SM-Saml-issuer" />
</TechnicalProfile>
<!-- Session management technical profile for SAML based tokens -->
<TechnicalProfile Id="SM-Saml-issuer">
<DisplayName>Session Management Provider</DisplayName>
<Protocol Name="Proprietary" Handler="Web.TPEngine.SSO.SamlSSOSessionProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
</TechnicalProfile>
</TechnicalProfiles>
</ClaimsProvider>
設定您的應用程式
為了讓應用程式參與單一登出:
- 針對 SAML 服務提供者,請在應用程式的 SAML 中繼資料文件中使用 SingleLogoutService 位置來加以設定。 您也可以設定應用程式註冊
logoutUrl
。 如需詳細資訊,請參閱設定登出 URL。 - 針對 OpenID Connect 或 OAuth2 應用程式,請設定應用程式註冊資訊清單的
logoutUrl
屬性。 若要設定登出 URL:- 從 [Azure AD B2C] 功能表中,選取 [應用程式註冊]。
- 選取您的應用程式註冊。
- 在 [管理] 底下,選取 [驗證]。
- 在 [Front-channel logout URL] \(前端通道登出 URL\) 下,設定您的登出 URL。
處理單一登出要求
當 Azure AD B2C 收到登出要求時,其會使用前端通道 HTML iframe,將 HTTP 要求傳送至使用者目前登入之每個參與應用程式的已註冊登出 URL。 請注意,觸發登出要求的應用程式不會收到此登出訊息。 您的應用程式必須藉由清除識別使用者的應用程式工作階段,來回應登出要求。
- 針對 OpenID Connect 與 OAuth2 應用程式,Azure AD B2C 會將 HTTP GET 要求傳送至已註冊的登出 URL。
- 針對 SAML 應用程式,Azure AD B2C 會將 SAML 登出要求傳送至已註冊的登出 URL。
當所有應用程式都已收到登出通知時,Azure AD B2C 將會執行下列其中一項動作:
- 針對 OpenID Connect 或 OAuth2 應用程式,會將使用者重新導向至要求的
post_logout_redirect_uri
,包括初始要求中指定的 (選擇性)state
參數。 例如https://contoso.com/logout?state=foo
。 - 針對 SAML 應用程式,SAML 登出回應會透過 HTTP POST 傳送至一開始傳送登出要求的應用程式。
保護您的登出重新導向
登出之後,會將使用者重新導向 post_logout_redirect_uri
參數中所指定的 URI,而不論已針對應用程式指定的回覆 URL 為何。 然而,若已傳遞有效的 id_token_hint
,並且已開啟 [Require ID Token in logout requests] \(登出要求中需要識別碼權杖\),則 Azure AD B2C 會先驗證 post_logout_redirect_uri
的值與其中一個應用程式所設定的重新導向 URI 相符,然後再執行重新導向。 若針對應用程式所設定的回覆 URL 沒有任何相符項目,即會顯示錯誤訊息,並且不會將使用者重新導向。
若在登出要求中需要識別碼權杖:
- 登入 Azure 入口網站。
- 確定您使用的目錄包含您的 Azure AD B2C 租用戶。 選取入口網站工具列中的目錄 + 訂閱圖示。
- 在 [入口網站設定] | [目錄 + 訂用帳戶] 頁面上,在 [目錄名稱] 清單中尋找您的 Azure AD B2C 目錄,然後選取 [切換]。
- 選擇 Azure 入口網站左上角的 [所有服務],然後搜尋並選取 [Azure AD B2C]。
- 選取 [使用者流程]。
- 開啟您先前建立的使用者流程。
- 選取 [屬性] 。
- 啟用 [Require ID Token in logout requests] \(登出要求中需要識別碼權杖\)。
- 返回 [Azure AD B2C]。
- 選取 [應用程式註冊],然後選取您的應用程式。
- 選取 [驗證]。
- 在 [登出 URL] 文字方塊中,鍵入登出後重新導向 URI,然後選取 [儲存]。
若登出要求中需要識別碼權杖,請在 RelyingParty 元素中新增 UserJourneyBehaviors 元素。 然後將 SingleSignOn 元素的 EnforceIdTokenHintOnLogout 設定為 true
。 如需詳細資訊,請查看即時示範。 您的 UserJourneyBehaviors 元素應如下列範例所示:
<UserJourneyBehaviors>
<SingleSignOn Scope="Tenant" EnforceIdTokenHintOnLogout="true"/>
</UserJourneyBehaviors>
若要設定應用程式登出 URL:
- 登入 Azure 入口網站。
- 確定您使用的目錄包含您的 Azure AD B2C 租用戶。 選取入口網站工具列中的目錄 + 訂閱圖示。
- 在 [入口網站設定] | [目錄 + 訂用帳戶] 頁面上,在 [目錄名稱] 清單中尋找您的 Azure AD B2C 目錄,然後選取 [切換]。
- 選擇 Azure 入口網站左上角的 [所有服務],然後搜尋並選取 [Azure AD B2C]。
- 選取 [應用程式註冊],然後選取您的應用程式。
- 選取 [驗證]。
- 在 [登出 URL] 文字方塊中,鍵入登出後重新導向 URI,然後選取 [儲存]。
後續步驟
- 了解如何在 Azure AD B2C 中設定權杖。