B2C:ADFS 的 AcquireTokenSilent 失败,适用于本地帐户

B2C: AcquireTokenSilent fails for ADFS, works for local accounts

我们在 B2C 登录流程中设置了 AD FS as an identity provider。交互式登录工作正常,但每当我们在单页应用程序 (SPA) 中使用 MSAL-JS 执行 acquireTokenSilent 时,我们都会收到错误消息:

Refused to display 'https://mytenant.b2clogin.com...' in a frame because it set 'X-Frame-Options' to 'deny'.

这只发生在隐式流中。使用授权代码授予的应用程序工作正常。本地帐户适用于这两种流程。通过阅读文档,这不应该发生,因为我应该有一个会话。

https://docs.microsoft.com/en-us/windows-server/identity/ad-fs/operations/customize-http-security-headers-ad-fs#x-frame-options

Note that non-interactive logins can be performed via iFrame due to prior session level security that has been established.

我该如何解决这个错误?

仔细检查我的政策和文档后,错误变得很明显。出于某种原因,我们的 SAML 技术配置文件政策中包含以下代码:

      <UseTechnicalProfileForSessionManagement ReferenceId="SM-Noop"/>

所以基本上用户有一个与 B2C 的会话,一个与 ADFS 的会话,但 B2C 没有与 ADFS 的会话。

一旦我们使用 documentation 中指示的 SamlSSOSessionProvider,一切就开始工作了。

          <UseTechnicalProfileForSessionManagement ReferenceId="SM-Saml-idp" />

....


    <ClaimsProvider>
      <DisplayName>Session Management</DisplayName>
      <TechnicalProfiles>
        <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="IncludeSessionIndex">false</Item>
            <Item Key="RegisterServiceProviders">false</Item>
          </Metadata>
        </TechnicalProfile>
      </TechnicalProfiles>
    </ClaimsProvider>

在进一步调查时,我们发现文档最初包含相同的错误,这就是我们最初获得代码的方式。文档是 fixed one month ago!