【问题标题】:Azure ADB2C multiple Web APIs authenticationAzure ADB2C 多 Web API 身份验证
【发布时间】:2019-12-02 06:42:24
【问题描述】:

我的场景与配置 ADB2C 的同一个 MVC Web 应用程序中的两个或多个 Web API 的身份验证有关。

我在 Azure ADB2C 中创建了两个 Web API,并将这两个 Web API 的权限授予 ADB2C MVC Web 应用程序。但是,每当我尝试获取访问令牌时,它都会给我一个 web api 的访问令牌,但没有给第二个 web api 的访问令牌。

我想知道这种情况在 ADB2C 中是否可行?

谢谢。

【问题讨论】:

    标签: authentication asp.net-core .net-core azure-ad-b2c


    【解决方案1】:

    一个访问令牌可以被一个资源(web api)访问。如果您想要另一个资源的访问令牌,您可以使用刷新令牌(如果存在)来获取新令牌:

    https://docs.microsoft.com/en-us/azure/active-directory/develop/v2-oauth2-auth-code-flow#refresh-the-access-token

    如果使用MSAL.NET,在初始令牌获取后,您可以调用AcquireTokenSilent,询问您需要的api范围:

    // Retrieve the token with the specified scopes
    var scope = AzureAdB2COptions.ApiScopes.Split(' ');
    string signedInUserID = HttpContext.User.FindFirst(ClaimTypes.NameIdentifier).Value;
    
    IConfidentialClientApplication cca =
    ConfidentialClientApplicationBuilder.Create(AzureAdB2COptions.ClientId)
        .WithRedirectUri(AzureAdB2COptions.RedirectUri)
        .WithClientSecret(AzureAdB2COptions.ClientSecret)
        .WithB2CAuthority(AzureAdB2COptions.Authority)
        .Build();
    new MSALStaticCache(signedInUserID, this.HttpContext).EnablePersistence(cca.UserTokenCache);
    
    var accounts = await cca.GetAccountsAsync();
    AuthenticationResult result = await cca.AcquireTokenSilent(scope, accounts.FirstOrDefault())
        .ExecuteAsync(); 
    

    MSAL 将查找缓存并返回任何与要求匹配的缓存令牌。如果此类访问令牌已过期或不存在合适的访问令牌,但存在关联的刷新令牌,则 MSAL 将自动使用它来获取新的访问令牌并透明地返回它。

    您可以点击here获取代码示例。

    【讨论】:

    • 嗨,南,我完全按照您在此处的建议进行了尝试。但是当我试图通过传递另一个 web api 的范围来获取令牌时,它并没有给我访问令牌。它以 null 的形式出现。
    • 你是否成功获取第一个资源的访问令牌+刷新令牌。
    • 是的。我成功获得了第一个 web api 的访问令牌和刷新令牌。
    • 如果你交换范围,你还能得到一个访问令牌吗?
    • 一次只能请求一个资源。您的回答表明您在一个请求中尝试将两种范围都用于不同的资源,这是行不通的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-08
    • 2017-07-24
    • 1970-01-01
    • 1970-01-01
    • 2020-07-27
    • 2017-09-05
    • 1970-01-01
    相关资源
    最近更新 更多