Azure B2C 联合注销未完成(身份令牌未传递到第三方结束会话端点)

Posted

技术标签:

【中文标题】Azure B2C 联合注销未完成(身份令牌未传递到第三方结束会话端点)【英文标题】:Azure B2C federated sign out is not complete (identity token is not passed to third party end session endpoint) 【发布时间】:2021-04-14 23:31:05 【问题描述】:

我有使用 Azure B2C 作为 IDP 的应用程序。 Azure B2C 提供了一种通过 OpenIdConnect 使用本地帐户或联合到第三方 IDP(身份服务器)的可能性。我在 B2C 中使用自定义策略。登录工作正常,但我在退出时遇到问题。从联合身份提供者注销已执行,但第三方 IDP 的身份令牌未传递到结束会话端点并且未正确执行注销。

退出请求:

    获取https://xxxxx.b2clogin.com/xxxxx.onmicrosoft.com/b2c_1a_signup_signin/oauth2/v2.0/logout?post_logout_redirect_uri=https%3A%2F%2Flocalhost%3A44317%2Fsignout-callback-oidc&id_token_hint=xxxxx GET https://thirdpartyidp.com/idp/connect/endsession 获取https://thirdpartyidp.com/idp/logout?id=xxxxx GET https://localhost:44317/signout-callback-oidc?state=xxxxx

我也用开箱即用的用户流对此进行了测试,但出现了同样的问题。

我正在使用此技术配置文件配置:

<ClaimsProvider>
    <Domain>thirdpartyidp</Domain>
    <DisplayName>thirdpartyidp</DisplayName>
    <TechnicalProfiles>
      <TechnicalProfile Id="thirdpartyidp-OAUTH">
        <DisplayName>thirdpartyidp</DisplayName>
        <Protocol Name="OpenIdConnect" />
        <Metadata>
          <Item Key="ProviderName">thirdpartyidp</Item>
          <Item Key="METADATA">https://thirdpartyidp.com/idp/.well-known/openid-configuration</Item>
          <Item Key="ValidTokenIssuerPrefixes">https://thirdpartyidp.com</Item>
          <Item Key="IdTokenAudience">app</Item>
          <Item Key="DiscoverMetadataByTokenIssuer">true</Item>
          <Item Key="response_types">code</Item>
          <Item Key="response_mode">form_post</Item>
          <Item Key="scope">openid profile</Item>
          <Item Key="HttpBinding">POST</Item>
          <Item Key="UsePolicyInRedirectUri">false</Item>
          <Item Key="client_id">app</Item>
          <Item Key="SingleLogoutEnabled">true</Item>        
        </Metadata>
        <CryptographicKeys>
          <Key Id="client_secret" StorageReferenceId="B2C_1A_thirdpartyidp" />
        </CryptographicKeys>
        <OutputClaims>
          <OutputClaim ClaimTypeReferenceId="issuerUserId" PartnerClaimType="sub" />
          <OutputClaim ClaimTypeReferenceId="givenName" PartnerClaimType="sub" />
          <OutputClaim ClaimTypeReferenceId="surName" PartnerClaimType="sub" />
          <OutputClaim ClaimTypeReferenceId="displayName" PartnerClaimType="sub" />
          <OutputClaim ClaimTypeReferenceId="authenticationSource" DefaultValue="socialIdpAuthentication" />
          <OutputClaim ClaimTypeReferenceId="identityProvider" PartnerClaimType="iss" />
          <OutputClaim ClaimTypeReferenceId="identityProviderAccessToken" PartnerClaimType="oauth2:access_token" />
        </OutputClaims>
        <OutputClaimsTransformations>
          <OutputClaimsTransformation ReferenceId="CreateRandomUPNUserName"/>
          <OutputClaimsTransformation ReferenceId="CreateUserPrincipalName"/>
          <OutputClaimsTransformation ReferenceId="CreateAlternativeSecurityId"/>
        </OutputClaimsTransformations>
        <UseTechnicalProfileForSessionManagement ReferenceId="SM-SocialLogin"/>
      </TechnicalProfile>   
    </TechnicalProfiles>
  </ClaimsProvider>

我发现两三年前的文章表明 Azure AD B2C 不支持将您从外部身份提供程序中注销。根据这篇相当新的文章(https://docs.microsoft.com/en-us/azure/active-directory-b2c/session-behavior?pivots=b2c-custom-policy#sign-out),如果我理解正确的话应该是可能的。 Azure B2C 肯定会尝试联合注销,但它并不完整。

我是否有某种自定义策略配置问题或可能是什么问题?

【问题讨论】:

【参考方案1】:

您需要configure您的依赖方在注销期间发送 Id 令牌。

<UserJourneyBehaviors>
  <SingleSignOn Scope="Tenant" EnforceIdTokenHintOnLogout="true"/>
</UserJourneyBehaviors>

【讨论】:

【参考方案2】:

我从 MS 支持部门得到答复,目前不支持将身份令牌传递给第三方 IDP 结束会话端点。

【讨论】:

以上是关于Azure B2C 联合注销未完成(身份令牌未传递到第三方结束会话端点)的主要内容,如果未能解决你的问题,请参考以下文章

MVC 5、WIF (System.IdentityModel) 和 ADFS 未实际进行身份验证,联合注销时出错

Azure AD 身份验证令牌未通过 Web api 授权

用于Azure B2C acces令牌的Exchange Facebook SDK acces令牌

会话超时后 Azure AD B2C 注销

Azure AD B2C 与 ASP.NET Web API 发出令牌,用于 Web API 中的身份验证和访问 MS Graph API

azure 移动服务活动目录身份验证 X-ZUMO-AUTH 令牌在注销后在邮递员中有效