为什么添加Microsoft Identity auth会导致另一个策略的GetTokenAsync“ access_token”返回null?

问题描述

问题:

我有一个具有OpenIdConnect身份验证的ASP.NET Core 3.1 Web应用程序。我在另一(非认)策略上添加了Microsoft身份验证(Azure Active Directory v2),以在一个特定控制器上使用。

在具有我的原始OpenIdConnect实现授权的控制器调用的情况下,在下面一行(在Startup.cs中)添加Microsoft Identity会使httpContext.GetTokenAsync("access_token")返回null。被调用httpContext仍然具有原始OpenIdConnect实现的所有自定义声明。删除以下行即可解决此问题,我可以成功获取访问令牌。

services.AddMicrosoftIdentityWebAppAuthentication(Configuration,"AzureAd","AzureAdOpenIdConnect","AzureAdOpenIdCookies");

其他详细信息:

Microsoft Identity实现是在单独的策略上

services.AddAuthorization(options =>
{
    options.DefaultPolicy = new AuthorizationPolicyBuilder()
        .RequireAuthenticatedUser()
        .AddAuthenticationSchemes("oidcFlow") // scheme name for my original OpenIdConnect auth implementation
        .Build();

    options.AddPolicy("AzureAdOidc",new AuthorizationPolicyBuilder()
        .RequireAuthenticatedUser()
        .AddAuthenticationSchemes("AzureAdOpenIdConnect","AzureAdOpenIdCookies") // scheme names used above when initializing Microsoft Identity
        .Build());
});

没有试图使用AzureAdOidc策略的控制器被试图获取访问令牌的认策略控制器调用

解决方法

更新:

AddMicrosoftIdentityWebAppAuthentication调用移到ConfigureServices中其他auth实现的上方(在Startup.cs中)解决了此问题,我可以从通过我的其他auth实现进行身份验证的调用中获取访问令牌。