首页 > 解决方案 > ASP.NET Core 2.2 中的混合身份验证方案在用户登录时恢复为默认方案

问题描述

在我的 ASP.NET Core Web 应用程序中,我配置了多个身份验证方案,如下所示:

services.AddAuthentication(AzureADDefaults.AuthenticationScheme)
                    .AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, jwtOptions =>
                                                                          {
                                                                              AzureAdOptions azureAdOptions = new AzureAdOptions();
                                                                              Configuration.Bind("AzureAd", azureAdOptions);

                                                                              jwtOptions.Authority = $"{azureAdOptions.Instance}/{azureAdOptions.Domain}";
                                                                              jwtOptions.Audience = azureAdOptions.ClientId.ToString();
                                                                              jwtOptions.TokenValidationParameters = new TokenValidationParameters
                                                                                                                     {
                                                                                                                         ValidateIssuer = true,
                                                                                                                         ValidateAudience = true,
                                                                                                                         ValidateLifetime = true,
                                                                                                                         ValidateIssuerSigningKey = true
                                                                                                                     };
                                                                              jwtOptions.Events = new JwtBearerEvents
                                                                                                  {
                                                                                                      OnAuthenticationFailed = context =>
                                                                                                                               {
                                                                                                                                   context.Response.StatusCode = (int)HttpStatusCode.Unauthorized;
                                                                                                                                   return context.Response.WriteAsync(string.Empty);
                                                                                                                               }
                                                                                                  };
                                                                          })
                    .AddAzureAD(options => Configuration.Bind("AzureAd", options));

目标是允许用户使用他们的 AzureAD 帐户登录应用程序,同时还允许外部应用程序使用 Bearer 令牌访问我们的 API。

只要仅使用承载令牌认证的端点,此解决方案就可以正常工作。

问题是,只要任何普通用户发送请求,混合身份验证就会完全停止工作。使用 Bearer 令牌发出的任何请求都会收到 302 Found 响应并重定向到用户登录页面,并以 HTML 形式返回。

所有外部 API 端点的方案都定义为:

[Authorize(Policies.RolePolicy, AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]

为用户指定的终结点没有明确定义其方案,因为它们应使用默认的 AzureADDefaults.AuthenticationScheme。

这个问题是否已知,是否有任何解决方法?我找不到任何有用的东西,并决定为我的应用程序的外部 API 部分创建一个单独的 Web 应用程序。

标签: authenticationazure-active-directoryasp.net-core-mvc

解决方案


推荐阅读