authentication - 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 应用程序。
解决方案
推荐阅读
- java - 用户输入字符串时如何重新提示用户输入有效输入(Java)
- hadoop - 所有datanodes hdfs的顺序自动重启
- git - 我无法将代码推送到远程 devOps 存储库
- java - 对 BigInteger 数组进行基数排序
- sql - 计算postgresql缓冲区内多边形的百分比
- kotlin - TornadoFX DataGrid 与 ScrollPane
- keras - 在训练活动识别模型时观察不同机器中不同的模型性能
- spring - 如何修复 Spring MVC 中的自定义删除查询(使用 JPARepository 和 MYSQL)?
- javascript - selrrrow 在 jqGrid 4.15.6 中返回 null
- elasticsearch-dsl - 如何在 Elasticsearch_dsl 中搜索嵌套文档