将网站从.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;
})
我终于找到了解决这个问题的方法,但是我不知道为什么它真的有帮助。
最初,我将服务设置为:
services
.AddIdentity<IdentityUser, IdentityRole>()
.AddSignInManager()
.AddEntityFrameworkStores<CleWebToolsIdentityDbContext>();
但是重定向完成了。
最终解决我问题的方法是将它们设置为:
services
.AddIdentityCore<IdentityUser>()
.AddRoles<IdentityRole>()
.AddSignInManager()
.AddEntityFrameworkStores<CleWebToolsIdentityDbContext>();
有人可以告诉我这是怎么回事吗?
即使挑战方案应为JWT,AddIdentity方法如何导致重定向?
这是因为AddIdentity
为应用程序本身,外部登录(例如Facebook和Google)和2FA注册了默认的基于Cookie的身份验证方案。如果将services.AddIdentity<IdentityUser, IdentityRole>()
放在AddJwtBearer
配置下面,它将重置默认架构,为避免这种情况,可以将身份配置放在jwt bearer config之上:
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 =>
{
....
});
使用AddIdentityCore
是有效的,因为它不会注册默认的基于Cookie的身份验证方案,有关更多详细信息,请参见AddIdentity vs AddIdentityCore。>