ASP.NET Core 5无法同时使用Identity与JWT认证问题咨询
问题根因
你添加JWT配置时,通过AddAuthentication(JwtBearerDefaults.AuthenticationScheme)将JWT Bearer设置为了全局默认认证方案,直接覆盖了ASP.NET Core Identity默认配置的Cookie认证方案,导致Web应用的请求不再走Cookie认证逻辑,原有登录功能失效。
修复步骤
1. 调整认证服务注册逻辑
保留Identity默认的Cookie认证作为全局默认方案,仅追加JWT Bearer认证方案,不要覆盖原有默认配置。将你注释的JWT配置块替换为以下代码即可:
// 原有Identity配置完全保留,无需修改 services.AddDefaultIdentity<ApplicationUser>(options => options.SignIn.RequireConfirmedAccount = true) .AddRoles<ApplicationRole>() .AddEntityFrameworkStores<ApplicationDbContext>(); // 追加JWT认证,调用AddAuthentication时不要传入默认方案参数 services.AddAuthentication() .AddJwtBearer(options => { options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, ValidateAudience = true, ValidateLifetime = true, ValidateIssuerSigningKey = true, ValidIssuer = Configuration["Jwt:Issuer"], ValidAudience = Configuration["Jwt:Audience"], IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Jwt:Key"])) }; });
你原有Configure方法中的中间件顺序(UseRouting→UseAuthentication→UseAuthorization)是正确的,无需调整。
2. 为Web API接口指定JWT认证方案
在所有对外提供的API控制器/接口上,通过特性标记指定使用JWT方案做认证,示例:
[ApiController] [Route("api/[controller]")] // 指定该控制器下所有接口用JWT认证 [Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)] public class YourApiController : ControllerBase { [HttpGet] public IActionResult GetData() { return Ok(); } }
可选:双认证方案兼容配置
如果存在部分接口需要同时支持Web端Cookie认证和API端JWT认证,可以配置通用授权策略,两种凭证携带任意一种有效即可通过认证:
services.AddAuthorization(options => { options.DefaultPolicy = new AuthorizationPolicyBuilder() .AddAuthenticationSchemes( IdentityConstants.ApplicationScheme, JwtBearerDefaults.AuthenticationScheme ) .RequireAuthenticatedUser() .Build(); });
内容的提问来源于stack exchange,提问作者Jon
相关产品推荐
相关产品推荐

