Azure AD B2C 的多个访问令牌
Multiple access tokens with Azure AD B2C
我们有一个 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
的两个调用中的任何一个,剩下的调用将按预期工作,无论它是两个调用中的哪一个。这似乎表明我们所有的配置都是正确的,所以我不会 post 那些在这里进行审查。
我见过的所有示例代码都只显示了一个正在获取的访问令牌。同样,当我们隔离这两个调用中的任何一个时,它都能完美地工作。只有当我们尝试获取两个令牌时它才会失败,并且总是在两个令牌中的第二个,无论顺序如何。此外,发生这种情况时我们没有遇到任何异常。
任何人都可以提供任何关于这里可能发生的事情的线索吗?感谢您的帮助。
根本问题在于,根据 OAuth 标准,您不应多次尝试使用相同的授权代码。
来自https://www.rfc-editor.org/rfc/rfc6749#section-10.5
Authorization codes MUST be short lived and single-use. If the authorization server observes multiple attempts to exchange an authorization code for an access token, the authorization server SHOULD attempt to revoke all access tokens already granted based on the conmpromnised authorization code.
因此,Azure AD B2C 目前无法支持您的用例,因为您无法在单个访问令牌中请求多个受众和范围。
如果您可以控制这几个 API 并且可以使它们共享一个受众,但可能有自己的范围,则可以对它们全部使用一个访问令牌。
我们有一个 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
的两个调用中的任何一个,剩下的调用将按预期工作,无论它是两个调用中的哪一个。这似乎表明我们所有的配置都是正确的,所以我不会 post 那些在这里进行审查。
我见过的所有示例代码都只显示了一个正在获取的访问令牌。同样,当我们隔离这两个调用中的任何一个时,它都能完美地工作。只有当我们尝试获取两个令牌时它才会失败,并且总是在两个令牌中的第二个,无论顺序如何。此外,发生这种情况时我们没有遇到任何异常。
任何人都可以提供任何关于这里可能发生的事情的线索吗?感谢您的帮助。
根本问题在于,根据 OAuth 标准,您不应多次尝试使用相同的授权代码。
来自https://www.rfc-editor.org/rfc/rfc6749#section-10.5
Authorization codes MUST be short lived and single-use. If the authorization server observes multiple attempts to exchange an authorization code for an access token, the authorization server SHOULD attempt to revoke all access tokens already granted based on the conmpromnised authorization code.
因此,Azure AD B2C 目前无法支持您的用例,因为您无法在单个访问令牌中请求多个受众和范围。
如果您可以控制这几个 API 并且可以使它们共享一个受众,但可能有自己的范围,则可以对它们全部使用一个访问令牌。