我们有一个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
的作用域。
此外,如果我们简单地注释掉对的两个调用中的任何一个,则GetAccessToken
无论它是两个中的哪个,其余调用都能按预期工作。这似乎表明我们所有的配置都是正确的,因此我不会在此处发布这些配置进行审查。
我见过的所有示例代码都只显示了一个访问令牌。同样,当我们隔离两个呼叫中的任何一个时,它都可以完美地工作。仅当我们尝试同时获取两个令牌时,无论顺序如何,它总是在两个令牌中的第二个令牌上失败。此外,发生这种情况时,我们也不会遇到任何异常。
谁能提供任何有关这里发生情况的线索?谢谢你的帮助。
根本的问题是,按照OAuth标准,您不应多次尝试使用相同的授权代码。
来自https://tools.ietf.org/html/rfc6749#section-10.5
授权码必须是短期的且只能使用一次。如果授权服务器观察到多次尝试为访问令牌交换授权代码,则授权服务器应尝试基于功能受限的授权代码撤回已授予的所有访问令牌。
因此,Azure AD B2C目前无法支持您的用例,因为您无法在单个访问令牌中请求多个访问者和范围。
如果您可以控制这几个API,并且可以使它们共享一个受众,但可能具有各自的作用域,则可以对它们全部使用一个访问令牌。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句