【问题标题】:Multiple access tokens with Azure AD B2CAzure AD B2C 的多个访问令牌
【发布时间】:2019-04-12 14:41:34
【问题描述】:

我们有一个 Web 应用程序,它需要对多个 Web API 进行身份验证访问。我们正在使用 Azure AD B2C 进行身份验证,除了一个非常令人沮丧且非常有限的问题外,我们工作正常:我们一次只能取回一个有效的访问令牌,但我们需要多个。

下面的 sn-p 显示了关注的区域。

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;
    }
}

显示的代码 sn-ps 在从 Azure AD B2C 接收到身份验证令牌之后调用。。如图所示执行此代码时,将返回两个访问令牌中的第一个,并且完全有效。但是,第二个具有 access_token: nullfirst 令牌的范围。

此外,如果我们简单地注释掉对GetAccessToken 的两个调用中的任何一个,则剩余的调用会按预期工作,无论它是两个调用中的哪一个。这似乎表明我们所有的配置都是正确的,因此我不会在此处发布这些配置以供审核。

我见过的所有示例代码都只显示了一个正在获取的访问令牌。同样,当我们隔离这两个调用中的任何一个时,它都能完美运行。只有当我们尝试获取两个令牌时它才会失败,并且总是在两个令牌中的第二个,无论顺序如何。此外,发生这种情况时,我们没有遇到任何异常。

谁能提供关于这里可能发生的事情的任何线索?感谢您的帮助。

【问题讨论】:

    标签: authentication azure-active-directory access-token azure-ad-b2c


    【解决方案1】:

    根本问题是,根据 OAuth 标准,您不应该多次尝试使用相同的授权代码。

    来自https://www.rfc-editor.org/rfc/rfc6749#section-10.5

    授权码必须是短暂的且一次性使用。如果授权服务器观察到多次尝试将授权码交换为访问令牌,则授权服务器应该尝试撤销所有已根据被泄露的授权码授予的访问令牌。

    因此,Azure AD B2C 目前无法支持您的用例,因为您无法在单个访问令牌中请求多个受众和范围。

    如果您可以控制这几个 API,并且可以使它们共享一个受众,但可能有自己的范围,那么您可以为它们都使用一个访问令牌。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-12
      • 2018-04-26
      • 2017-12-22
      • 2021-10-26
      • 2020-09-09
      • 2021-03-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多