从 ASP.NET Core 2.2 迁移后,ASP.NET Core 3.1.1 Jwt 重定向而不是返回 http 状态 401

Sim*_*sen 3 c# authentication .net-core asp.net-core-identity

将我的网站从 .NET Core 2.2 迁移到 3.1.1 后,我的 api 端点突然开始尝试将我的 api 请求重定向到默认登录页面(/Account/Login?ReturnUrl=,我的任何路由中都没有该页面)。

我的 api 使用 JWT 承载身份验证方案和 JWT 挑战方案,但仍然发生了重定向。

services.AddAuthentication(options =>
{
    options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
    options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
    options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
Run Code Online (Sandbox Code Playgroud)

我终于找到了问题的解决方案,但我不知道为什么它实际上有帮助。

最初我的服务设置为:

services
  .AddIdentity<IdentityUser, IdentityRole>()
  .AddSignInManager()
  .AddEntityFrameworkStores<CleWebToolsIdentityDbContext>();
Run Code Online (Sandbox Code Playgroud)

但这确实实现了重定向。

最终解决我的问题的是将它们设置为:

services
  .AddIdentityCore<IdentityUser>()
  .AddRoles<IdentityRole>()
  .AddSignInManager()
  .AddEntityFrameworkStores<CleWebToolsIdentityDbContext>();
Run Code Online (Sandbox Code Playgroud)

有人能告诉我这是怎么回事吗?

即使质询方案应该是 JWT,AddIdentity 方法如何导致重定向?

Nan*_* Yu 7

这是因为AddIdentity为应用程序本身、外部登录(例如 Facebook 和 Google)和 2FA 注册了默认的基于 Cookie 的身份验证方案。services.AddIdentity<IdentityUser, IdentityRole>()如果您将身份配置放在配置下方,它将重置默认架构AddJwtBearer,为了避免这种情况,您可以将身份配置放在 jwt 承载配置上方:

services
.AddIdentity<IdentityUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>().AddDefaultTokenProviders().AddDefaultUI();

services.AddAuthentication(options =>
{
    options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
    options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
    options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(options =>
{
  ....

});
Run Code Online (Sandbox Code Playgroud)

使用AddIdentityCore有效,因为它不会注册默认的基于 Cookie 的身份验证方案,请参阅AddIdentity 与 AddIdentityCore了解更多详细信息。