为什么我们需要多个令牌请求:
我们正在对SPA使用隐式流,以从Azure AD B2C获取访问令牌以访问受B2C保护的API。我们需要访问多个API,并且这些API在B2C中都注册为不同的应用程序,因此每个API都有不同的受众。由于他们都是不同的受众,因此B2C不支持针对多个受众的单个令牌请求,因此我们不得不提出多个令牌请求。
B2C设置背景
我们支持本地帐户登录,以及使用其他Azure AD身份提供程序的社交登录。我们还在B2C(身份体验框架)中使用自定义策略
问题
使用Azure AD登录社交登录的用户会发生此问题。用户已登录。
发出多个请求时,我们在google chrome中注意到以下网络跟踪:
问题
-更新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中提出的。