Azure AD B2C并发访问令牌请求

时间:2019-03-03 13:46:47

标签: azure azure-active-directory azure-ad-b2c azure-ad-b2b

为什么我们需要多个令牌请求:

我们正在对SPA使用隐式流,以从Azure AD B2C获取访问令牌以访问受B2C保护的API。我们需要访问多个API,并且这些API在B2C中都注册为不同的应用程序,因此每个API都有不同的受众。由于他们都是不同的受众,因此B2C不支持针对多个受众的单个令牌请求,因此我们不得不提出多个令牌请求。

B2C设置背景

我们支持本地帐户登录,以及使用其他Azure AD身份提供程序的社交登录。我们还在B2C(身份体验框架)中使用自定义策略

问题

使用Azure AD登录社交登录的用户会发生此问题。用户已登录

发出多个请求时,我们在google chrome中注意到以下网络跟踪:

Chrome network trace 上面的痕迹显示:

  1. 第1行和第2行是B2C authorize 端点针对2种不同的api / scope / audience的令牌请求。
  2. 第3 + 4行和第5 + 6行,它们分别重定向到 login.windows.net login.microsoftonline.com ,它们都是针对特定api的1套/ scope / audience。
  3. 第7行和第8行都是将响应(id令牌)形式发回到B2C的形式。第7行从表单发布中返回错误请求响应。

问题

  1. 为什么需要重定向回 login.windows.net login.microsoftonline.com ? ,他是否应该没有有效的会话,这样B2C才可以返回所请求的令牌?
  2. B2C可以支持来自同一浏览器的并发令牌请求(或登录)以获取社交登录身份吗??我们怀疑这是由于B2C期望的身份验证状态造成的来自社交登录的信息只有一个并且是唯一的,因此并发登录会导致此请求彼此覆盖,从而导致其他请求无效。错误请求响应完全没有细节。它仅显示带有“错误请求”文本的空白页。

-更新2019年3月5日-

在修改了B2C自定义策略之后,通过更改以下内容,我设法抑制了重定向(登录一次后):

        <TechnicalProfile Id="SM-SocialLogin">
          <DisplayName>Session Mananagement Provider</DisplayName>
          <!--Changed to this provider instead of ExternalLoginSSOSessionProvider-->
          <Protocol Name="Proprietary" Handler="Web.TPEngine.SSO.DefaultSSOSessionProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
          <PersistedClaims>
            <PersistedClaim ClaimTypeReferenceId="alternativeSecurityId" />
            <PersistedClaim ClaimTypeReferenceId="objectId" />
            ... removed for brevity ...
            <PersistedClaim ClaimTypeReferenceId="groups" />
          </PersistedClaims>
          <OutputClaims>
            <OutputClaim ClaimTypeReferenceId="objectIdFromSession" DefaultValue="true"/>
          </OutputClaims>
        </TechnicalProfile>

所做的更改是使用默认的会话提供程序。

为什么外部会话提供程序不会抑制重新认证?设置为false的元数据AlwaysFetchClaimsFromProvider也不会抑制重新认证。

但是采用这种解决方法会导致我们遇到另一个问题,这是在单独的question中提出的。

0 个答案:

没有答案