我们有一个Web应用程序,需要对多个Web API进行身份验证访问。我们正在使用Azure AD B2C进行身份验证,除了一个非常令人沮丧且非常局限的问题,我们可以正常工作:我们一次只能获取一个有效的访问令牌,但我们需要几个。
下面的代码段显示了关注的领域。
private async Task OnAuthorizationCodeReceived(AuthorizationCodeReceivedNotification notification)
{
await GetAccessToken(notification, TaskScopes);
await GetAccessToken(notification, UserScopes);
}
private async Task<AuthenticationResult> GetAccessToken(AuthorizationCodeReceivedNotification notification, string[] scopes)
{
string signedInUserID = notification.AuthenticationTicket.Identity.FindFirst(ClaimTypes.NameIdentifier).Value;
TokenCache userTokenCache = new MSALSessionCache(signedInUserID, notification.OwinContext.Environment["System.Web.HttpContextBase"] as HttpContextBase).GetMsalCacheInstance();
ConfidentialClientApplication cca = new ConfidentialClientApplication(ClientId, Authority, RedirectUri, new ClientCredential(ClientSecret), userTokenCache, null);
try
{
return await cca.AcquireTokenByAuthorizationCodeAsync(notification.Code, scopes);
}
catch (Exception ex)
{
//TODO: Handle
throw;
}
}
在从Azure AD B2C收到身份验证令牌后,显示的代码段称为 。如图所示执行此代码时,将返回两个访问令牌中的第一个,并且完全有效。但是,第二个具有access_token: null
和 first 令牌的作用域。
此外,如果我们简单地注释掉对GetAccessToken
的两个调用中的任何一个,则无论其是哪个,其余调用均按预期工作。这似乎表明我们所有的配置都是正确的,因此我不会在此处发布这些配置进行审核。
我见过的所有示例代码都只显示了一个访问令牌。同样,当我们隔离两个呼叫中的任何一个时,它都可以正常工作。仅当我们尝试同时获取两个令牌时,无论顺序如何,它总是在两个令牌中的第二个令牌上失败。另外,发生这种情况时,我们也不会遇到任何异常。
任何人都可以提供有关此处发生情况的任何线索吗?感谢您的帮助。
答案 0 :(得分:1)
基本问题是,按照OAuth标准,您不应多次尝试使用相同的授权代码。
来自https://tools.ietf.org/html/rfc6749#section-10.5
授权码必须短暂且只能使用一次。如果授权服务器观察到多次尝试为访问令牌交换授权代码,则授权服务器应尝试基于功能受限的授权代码撤消已授予的所有访问令牌。
因此,由于您不能在单个访问令牌中请求多个受众和范围,因此Azure AD B2C暂时不支持您的用例。
如果您可以控制这几个API,并可以使它们共享一个受众,但可能具有各自的范围,则可以对它们全部使用一个访问令牌。