Azure Active Directory B2C 中的单一登录会话提供程序

在 Azure Active Directory B2C 中配置会话行为一文中,我们会介绍用于 Azure AD B2C 自定义策略的会话管理。 本文介绍如何在自定义策略中进一步配置任何单个技术配置文件的单一登录 (SSO) 行为。

例如,你为租户范围 SSO 配置策略,但你希望始终执行多重步骤,而不考虑活动 SSO 会话。 可以通过配置多重技术配置文件的会话提供程序来实现此行为。

可以将会话提供程序应用于两个流:

  • 全新登录
    • 当用户首次登录时,没有任何会话。 使用会话提供程序的任何技术配置文件都会成为会话参与者。
    • 会话提供程序可以将声明写入会话 cookie。
  • 后续登录
    • 当用户具有活动会话时,会将属于会话 cookie 一部分的声明读入到声明包中。
    • 无法更新属于会话 cookie 一部分的声明。
    • 会话提供程序可以将额外声明颁发到声明包中,这表示此技术配置文件是在 SSO 条件下执行的。
    • 可以跳过技术配置文件。

根据为给定技术配置文件选择的会话管理提供程序,会话行为可以是活动状态或受到禁止。 以下列表提供了一些使用会话提供程序的可能示例:

  • 在后续登录 (SSO) 期间阻止或强制用户界面中断。
  • 在后续登录 (SSO) 期间记住所选的标识提供者。
  • 在后续登录 (SSO) 期间减少读取到目录中的操作数。
  • 跟踪社交标识提供者会话以执行标识提供者注销。
  • 跟踪已登录信赖方应用以进行单一注销。

会话提供程序

有五个会话提供程序可用于管理技术配置文件处理 SSO 会话的方式。 配置技术配置文件时,必须选择最合适的会话提供程序。

下表根据要管理的技术配置文件的类型,显示了要使用的会话提供程序。 某些会话提供程序允许对会话 cookie 读取和写入声明。

会话提供程序 适用的技术配置文件类型 目的 写入声明 读取声明
DefaultSSOSessionProvider 自断言Microsoft Entra IDMicrosoft Entra 多重身份验证、声明转换 跳过技术配置文件执行。
ExternalLoginSSOSessionProvider OAuth1 标识提供者、Oauth2 标识提供者、OpenID Connect 标识提供者SAML 标识提供者 加速标识提供者选择页面。 执行单一注销。
OAuthSSOSessionProvider JWT 令牌颁发者 管理 OAuth2 或 OpenId Connect 信赖方与 Azure AD B2C 之间的会话。 执行单一注销。
SamlSSOSessionProvider SAML 令牌颁发者 管理 SAML 信赖方与 Azure AD B2C 之间的会话。 执行单一注销。
NoopSSOSessionProvider 任意 禁止任何技术配置文件成为会话的一部分。

下图显示了 Azure AD B2C 使用的会话类型。

Diagram showing the Azure AD B2C types of session providers.

引用会话提供程序

若要在技术配置文件中使用会话提供程序,请执行以下操作:

  1. 创建相应的会话管理技术配置文件。 请注意,Azure AD B2C 入门包中包含最常见的会话管理技术配置文件。 如果适用,可以引用现有会话管理技术配置文件。

    以下 XML 片段显示了入门包的 SM-AAD 会话管理技术配置文件。 会话提供程序属于 DefaultSSOSessionProvider 类型。

    <TechnicalProfile Id="SM-AAD">
      <DisplayName>Session Mananagement Provider</DisplayName>
      <Protocol Name="Proprietary" Handler="Web.TPEngine.SSO.DefaultSSOSessionProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
      <PersistedClaims>
        <PersistedClaim ClaimTypeReferenceId="objectId" />
        <PersistedClaim ClaimTypeReferenceId="signInName" />
        <PersistedClaim ClaimTypeReferenceId="authenticationSource" />
        <PersistedClaim ClaimTypeReferenceId="identityProvider" />
        <PersistedClaim ClaimTypeReferenceId="newUser" />
        <PersistedClaim ClaimTypeReferenceId="executed-SelfAsserted-Input" />
      </PersistedClaims>
      <OutputClaims>
        <OutputClaim ClaimTypeReferenceId="objectIdFromSession" DefaultValue="true" />
      </OutputClaims>
    </TechnicalProfile>
    
  2. 在技术配置文件中引用会话管理技术配置文件。 这样做可在后续登录 (SSO) 期间控制该技术配置文件的行为。

    若要从技术配置文件中引用会话管理技术配置文件,请添加 UseTechnicalProfileForSessionManagement 元素。 下面的示例演示如何使用 SM-AAD 会话管理技术配置文件。 将 ReferenceId 更改为会话管理技术配置文件的 ID。

    <TechnicalProfile Id="{Technical-profile-ID}">
      ...
      <UseTechnicalProfileForSessionManagement ReferenceId="SM-AAD" />
    </TechnicalProfile>
    

重要

当技术配置文件未引用任何会话管理提供程序时,系统将应用 DefaultSSOSessionProvider 会话提供程序,但这可能会导致意外行为。

注意

在刷新令牌流期间,系统不会调用会话管理提供程序。 颁发新访问令牌的所有尝试都是颁发的原始声明的副本。

管理会话声明

会话管理技术配置文件会控制在自定义策略执行过程中可以读取、写入或输出的声明。

在会话管理技术配置文件中,使用 PersistedClaimsOutputClaims 元素管理声明。

  • 持久化声明 - 可写入会话 cookie 的声明。
    • 对于要写入会话 cookie 的声明,它必须是当前声明包的一部分。
    • 在后续登录(单一登录)期间自动返回的所有声明。 无需指定输出声明。
  • 输出声明 - 可以在后续登录(单一登录)期间输出到声明包的额外声明。 由于输出声明不会从会话返回,因此必须设置默认值。

以下 XML 片段演示了持久化和输出声明元素:

<TechnicalProfile Id="SM-AAD">
  <DisplayName>Session Management Provider</DisplayName>
  <Protocol Name="Proprietary" Handler="Web.TPEngine.SSO.DefaultSSOSessionProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
  <PersistedClaims>
    <PersistedClaim ClaimTypeReferenceId="objectId" />
  </PersistedClaims>
  <OutputClaims>
    <OutputClaim ClaimTypeReferenceId="objectIdFromSession" DefaultValue="true"/>
  </OutputClaims>
</TechnicalProfile>

DefaultSSOSessionProviderExternalLoginSSOSessionProvider 会话管理提供程序可以配置为管理声明,以便在以下操作期间:

  • 全新登录
    • PersistedClaims 元素会将声明写入会话 cookie。 无法重写持久化声明。
  • 后续登录
    • 写入会话 cookie 的每个声明都会输出到声明包中,可在下一个业务流程步骤中使用。
    • OutputClaims 元素会将静态声明输出到声明包中。 使用 DefaultValue 属性设置输出声明的值。

DefaultSSOSessionProvider

DefaultSSOSessionProvider 会话提供程序可以配置为在后续登录(单一登录)期间管理声明,并允许跳过技术配置文件。 DefaultSSOSessionProvider 应用于持久保存和颁发后续业务流程步骤所需的声明,在后续登录(单一登录)期间以其他方式无法获取这些声明。 例如,可能通过从目录中读取用户对象获取的声明。

以下 SM-AAD 技术配置文件是 DefaultSSOSessionProvider 会话提供程序类型。 可以在自定义策略入门包中找到 SM-AAD 技术配置文件。

<TechnicalProfile Id="SM-AAD">
  <DisplayName>Session Management Provider</DisplayName>
  <Protocol Name="Proprietary" Handler="Web.TPEngine.SSO.DefaultSSOSessionProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
  <PersistedClaims>
    <PersistedClaim ClaimTypeReferenceId="objectId" />
    <PersistedClaim ClaimTypeReferenceId="signInName" />
    <PersistedClaim ClaimTypeReferenceId="authenticationSource" />
    <PersistedClaim ClaimTypeReferenceId="identityProvider" />
    <PersistedClaim ClaimTypeReferenceId="newUser" />
    <PersistedClaim ClaimTypeReferenceId="executed-SelfAsserted-Input" />
  </PersistedClaims>
  <OutputClaims>
    <OutputClaim ClaimTypeReferenceId="objectIdFromSession" DefaultValue="true"/>
  </OutputClaims>
</TechnicalProfile>

例如,SM-AAD 会话管理技术配置文件使用 DefaultSSOSessionProvider 会话提供程序。 当针对自定义策略入门包中的 SelfAsserted-LocalAccountSignin-Email 技术配置文件进行应用时,其行为如下所示:

  • 全新登录
    • signInName 会写入会话 cookie,因为会话管理技术配置文件 (SM-AAD) 使用 signInName 配置为持久化,并且引用 SM-AAD 的技术配置文件包含 signInNameOutputClaim。 此行为适用于满足此模式的所有声明。
  • 后续登录
    • 会跳过技术配置文件,用户不会看到登录页面。
    • 声明包会包含会话 cookie 中的 signInName 值(该值在全新登录时会持久保存),以及满足要持久保存到会话 cookie 中的模式的任何其他声明。
    • 会话管理技术配置文件返回 objectIdFromSession 声明,因为在后续登录(单一登录)期间会处理会话提供程序的 Output 声明。 在此例中,声明包中存在的 objectIdFromSession 声明指示用户声明由于单一登录而来自会话 cookie。

ExternalLoginSSOSessionProvider

ExternalLoginSSOSessionProvider 会话提供程序用于跳过“标识提供者选择”屏幕并从联合标识提供者注销。 它通常在为联合标识提供者(如 Microsoft Entra ID)配置的技术配置文件中引用。

  • 全新登录
    • PersistedClaims 元素会将声明写入会话 cookie。 无法重写持久化声明。
  • 后续登录
    • 写入会话 cookie 的每个声明都会输出到声明包中,可在下一个业务流程步骤中使用。
    • OutputClaims 元素会将静态声明输出到声明包中。 使用 DefaultValue 属性设置声明的值。
    • 当引用会话管理技术配置文件的技术配置文件包含持久保存到会话 cookie 中的 OutputClaim 时,随后会跳过此技术配置文件。

以下 SM-SocialLogin 技术配置文件是 ExternalLoginSSOSessionProvider 会话提供程序类型。 可以在自定义策略入门包中找到 SM-SocialLogin 技术配置文件。

<TechnicalProfile Id="SM-SocialLogin">
  <DisplayName>Session Management Provider</DisplayName>
  <Protocol Name="Proprietary" Handler="Web.TPEngine.SSO.ExternalLoginSSOSessionProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
  <PersistedClaims>
    <PersistedClaim ClaimTypeReferenceId="AlternativeSecurityId" />
  </PersistedClaims>
</TechnicalProfile>

当用户使用外部标识提供者登录时,会生成 AlternativeSecurityId 声明。 表示外部标识提供者用户的唯一标识符。 AlternativeSecurityId 声明会持久保存,以便在单一登录历程中,无需与联合标识提供者进行任何交互,即可从目录中读取用户的配置文件。

若要配置外部会话提供程序,请从 OAuth1、OAuth2 或 OpenID Connect 技术配置文件添加对 SM-SocialLogin 的引用。 有关详细信息,请参阅自定义策略入门包

OAuthSSOSessionProvider

OAuthSSOSessionProvider 会话提供程序用于管理 OAuth2 或 OpenId Connect 信赖方与 Azure AD B2C 之间的 Azure AD B2C 会话。 Azure AD B2C 支持单一注销(Single sign-out,也称为 Single Log-Out (SLO))。 当用户通过 Azure AD B2C 注销终结点注销时,Azure AD B2C 会从浏览器中清除用户的会话 cookie。 但是,用户可能在其他使用 Azure AD B2C 进行身份验证的应用程序中仍处于已登录状态。

这种类型的会话提供程序允许 Azure AD B2C 跟踪用户登录的所有 OAuth2 或 OpenId Connect 应用程序。 在一个应用程序的注销过程中,Azure AD B2C 会尝试调用所有其他已知的已登录应用程序的 logout 终结点。 此功能内置在会话提供程序中。 没有可供配置的持久化声明或输出声明。 以下 SM-jwt-issuer 技术配置文件属于 OAuthSSOSessionProvider 会话提供程序类型。

<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>

SM-jwt-issuer 技术配置文件是从 JwtIssuer 技术配置文件进行引用:

<TechnicalProfile Id="JwtIssuer">
  ...
  <UseTechnicalProfileForSessionManagement ReferenceId="SM-jwt-issuer" />
</TechnicalProfile>

SamlSSOSessionProvider

SamlSSOSessionProvider 会话提供程序用于管理与联合 SAML 标识提供者或 SAML 信赖方应用和 Azure AD B2C 的会话行为。

SAML 标识提供者会话管理

从 SAML 标识提供者会话引用 SamlSSOSessionProvider 会话提供程序时,RegisterServiceProviders 必须设置为 false

以下 SM-Saml-idp 技术配置文件是 SamlSSOSessionProvider 会话提供程序类型:

<TechnicalProfile Id="SM-Saml-idp">
  <DisplayName>Session Management Provider</DisplayName>
  <Protocol Name="Proprietary" Handler="Web.TPEngine.SSO.SamlSSOSessionProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
  <Metadata>
    <Item Key="RegisterServiceProviders">false</Item>
  </Metadata>
</TechnicalProfile>

若要使用 SM-Saml-idp 会话管理技术配置文件,请添加对 SAML 标识提供者技术配置文件的引用。 例如,AD FS SAML 标识提供者Contoso-SAML2 使用 SM-Saml-idp 会话管理技术配置文件。

<TechnicalProfile Id="Contoso-SAML2">
  ...
  <UseTechnicalProfileForSessionManagement ReferenceId="SM-Saml-idp" />
</TechnicalProfile>

SAML 服务提供商会话管理

引用 SamlSSOSessionProvider 会话提供程序以管理 SAML 信赖方会话时,RegisterServiceProviders 必须设置为 true。 需要 SessionIndexNameID 才能完成 SAML 会话注销。

以下 SM-Saml-issuer 技术配置文件是 SamlSSOSessionProvider 会话提供程序类型:

<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>

若要使用 SM-Saml-issuer 会话管理技术配置文件,请添加对 SAML 令牌颁发者技术配置文件的引用。 例如,Saml2AssertionIssuer 技术配置文件使用 SM-Saml-issuer 会话管理技术配置文件。

<TechnicalProfile Id="Saml2AssertionIssuer">
  ...
  <UseTechnicalProfileForSessionManagement ReferenceId="SM-Saml-issuer" />
</TechnicalProfile>

元数据

Attribute 必须 说明
IncludeSessionIndex 当前未使用,可以忽略。
RegisterServiceProviders 指示提供程序应注册已颁发断言的所有 SAML 服务提供程序。 可能的值为 true(默认)或 false

NoopSSOSessionProvider

NoopSSOSessionProvider 会话提供程序用于禁止单一登录行为。 即使用户具有活动会话时,也始终会处理使用此类型的会话提供程序的技术配置文件。 这种类型的会话提供程序对于强制特定技术配置文件始终运行十分有用,例如:

  • 声明转换 - 用于创建或转换以后用于确定要处理或跳过的业务流程步骤的声明。
  • Restful - 每次运行政策时,从 Restful 服务捕获最新数据。 还可以调用 Restful 进行扩展日志记录和审核。
  • 自断言 - 在每次运行策略时强制用户提供数据。 例如,使用一次性密码验证电子邮件,或请求用户同意。
  • Phonefactor - 强制用户执行多重身份验证作为“升级身份验证”的一部分,即使在后续登录(单一登录)期间也是如此。

此类型的会话提供程序不会将声明持久保存到用户的会话 cookie。 以下 SM-Noop 技术配置文件是 NoopSSOSessionProvider 会话提供程序类型。 可以在自定义策略入门包中找到 SM-Noop 技术配置文件。

<TechnicalProfile Id="SM-Noop">
  <DisplayName>Noop Session Management Provider</DisplayName>
  <Protocol Name="Proprietary" Handler="Web.TPEngine.SSO.NoopSSOSessionProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
</TechnicalProfile>

若要禁止技术配置文件的单一登录行为,请添加对 SM-Noop 技术配置文件的引用。 例如,AAD-Common 使用 SM-Noop 会话管理技术配置文件。 有关详细信息,请参阅自定义策略入门包

<TechnicalProfile Id="AAD-Common">
  ...
  <UseTechnicalProfileForSessionManagement ReferenceId="SM-Noop" />
</TechnicalProfile>

后续步骤

了解如何配置会话行为