如何配置ASP.NET Core 7实现API路径JWT认证与Identity表单共存
问题分析与解决方案
现有代码的核心问题
- 全局默认认证冲突:将
DefaultAuthenticateScheme和DefaultChallengeScheme都设为JWT Bearer,导致Identity的Cookie认证被全局覆盖,无法使用表单登录。 - 配置项拼写错误:
TokenValidationParameters中引用的JWKToekn是笔误,应该和前面的JWTToken一致,会导致读取不到正确的密钥/受众配置,引发JWT验证失败(401)。 - 生命周期验证关闭:
ValidateLifetime = false会跳过Token有效期校验,仅适合测试场景,生产环境建议开启。
修正后的认证配置
同时注册JWT Bearer和Identity Cookie认证,不设置全局默认方案,后续通过路径规则指定各路径使用的认证方式:
// 保留原Identity配置(示例,根据你的实际Identity注册代码调整) builder.Services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true) .AddEntityFrameworkStores<ApplicationDbContext>(); // 注册双认证方案:JWT Bearer + Identity Cookie builder.Services.AddAuthentication() .AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, p => { var key = Encoding.UTF8.GetBytes(builder.Configuration["JWTToken:key"]); p.SaveToken = true; p.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, // 根据业务需求调整,建议生产环境开启 ValidateAudience = true, // 根据业务需求调整,建议生产环境开启 ValidateLifetime = true, // 生产环境务必开启,避免过期Token被使用 ValidateIssuerSigningKey = true, ValidIssuer = builder.Configuration["JWTToken:Issuer"], // 修正拼写错误 ValidAudience = builder.Configuration["JWTToken:Audience"], // 修正拼写错误 IssuerSigningKey = new SymmetricSecurityKey(key) }; }) .AddCookie(IdentityConstants.ApplicationScheme); // 注册Identity默认的Cookie认证方案
配置中间件路径规则
在Program.cs中,通过MapWhen为/api路径单独指定认证逻辑,其余路径沿用Identity的表单登录流程:
app.UseRouting(); // 全局启用认证和授权中间件 app.UseAuthentication(); app.UseAuthorization(); // 为/api路径配置专属认证规则 app.MapWhen(context => context.Request.Path.StartsWithSegments("/api"), appBuilder => { // 强制/api路径使用JWT Bearer认证 appBuilder.Use(async (context, next) => { context.Items["__AuthenticationSchemes"] = JwtBearerDefaults.AuthenticationScheme; await next(); }); appBuilder.UseAuthentication(); appBuilder.UseAuthorization(); // 映射API控制器 appBuilder.MapControllers(); }); // 其余路径使用Identity Cookie认证 app.MapRazorPages(); app.MapControllers(); // 非API控制器映射到此处
控制器层面的认证约束
在API控制器或Action上显式指定JWT认证方案,确保认证逻辑精准生效:
[ApiController] [Route("api/[controller]")] [Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)] public class DemoApiController : ControllerBase { // 你的API接口逻辑 }
验证与注意事项
- 确保
appsettings.json中的JWT配置项正确:
{ "JWTToken": { "key": "你的对称加密密钥(建议长度≥32位,提升安全性)", "Issuer": "你的Token发行方标识", "Audience": "你的Token受众标识" } }
- 生成Token时,必须使用与配置一致的密钥、发行方、受众信息。
- 访问/api路径时,需在请求头中携带
Authorization: Bearer {你的Token}。 - 访问非/api路径(如登录页、普通页面)时,会自动跳转至Identity的表单登录界面。
内容的提问来源于stack exchange,提问作者Never_se
相关产品推荐
相关产品推荐

