ASP.NET Core 6 MVC添加JwtBearer认证后SignInManager失效问题
问题原因与解决方案
核心问题
你遇到的问题是默认认证方案冲突导致的:
- ASP.NET Core Identity的
SignInManager默认依赖Cookie认证方案(IdentityConstants.ApplicationScheme),登录后会在客户端写入身份Cookie。 - 当你把默认认证方案设为
JwtBearerDefaults.AuthenticationScheme后,系统会默认用JWT方案验证所有带[Authorize]标记的接口,同时User.Identity会优先尝试从JWT Token解析身份——但当前请求只有Cookie凭证、没有JWT Token,自然会导致身份识别失败,进而出现SignInManager失效、接口验证报错的情况。
解决方案
结合你的MVC+Identity场景,需要同时支持Cookie认证(供页面登录、SignInManager使用)和JWT认证(若有API需求),可按以下方式调整配置:
1. 修正认证方案默认设置
在Program.cs中,明确将默认认证、挑战方案设为Identity的Cookie方案,同时保留JWT认证配置(注意注册顺序,Identity服务要在认证配置之前):
// 先注册Identity服务 builder.Services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true) .AddEntityFrameworkStores<ApplicationDbContext>(); // 配置认证系统 builder.Services.AddAuthentication(options => { // 设置默认认证、挑战方案为Identity的Cookie方案 options.DefaultAuthenticateScheme = IdentityConstants.ApplicationScheme; options.DefaultChallengeScheme = IdentityConstants.ApplicationScheme; }) // 添加JWT认证方案 .AddJwtBearer(options => { options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, ValidateAudience = true, ValidateLifetime = true, ValidateIssuerSigningKey = true, ValidIssuer = builder.Configuration["Jwt:Issuer"], ValidAudience = builder.Configuration["Jwt:Audience"], IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(builder.Configuration["Jwt:Key"])) }; });
2. 给特定接口指定JWT认证方案
如果项目中有API接口需要用JWT验证,直接在[Authorize]特性中指定JWT方案即可,不会影响MVC页面的Cookie认证:
[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)] public IActionResult ApiAdmin() { // API业务逻辑 }
额外说明
如果你的项目其实不需要JWT认证,只是误加了相关配置,直接移除AddJwtBearer和默认方案设置就能回到原本的正常状态。
内容的提问来源于stack exchange,提问作者Diego
相关产品推荐
相关产品推荐

