You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置ASP.NET Core 7实现API路径JWT认证与Identity表单共存

问题分析与解决方案

现有代码的核心问题

  1. 全局默认认证冲突:将DefaultAuthenticateScheme和DefaultChallengeScheme都设为JWT Bearer,导致Identity的Cookie认证被全局覆盖,无法使用表单登录。
  2. 配置项拼写错误:TokenValidationParameters中引用的JWKToekn是笔误,应该和前面的JWTToken一致,会导致读取不到正确的密钥/受众配置,引发JWT验证失败(401)。
  3. 生命周期验证关闭: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接口逻辑
}

验证与注意事项

  1. 确保appsettings.json中的JWT配置项正确:
{
  "JWTToken": {
    "key": "你的对称加密密钥(建议长度≥32位,提升安全性)",
    "Issuer": "你的Token发行方标识",
    "Audience": "你的Token受众标识"
  }
}
  1. 生成Token时,必须使用与配置一致的密钥、发行方、受众信息。
  2. 访问/api路径时,需在请求头中携带Authorization: Bearer {你的Token}。
  3. 访问非/api路径(如登录页、普通页面)时,会自动跳转至Identity的表单登录界面。

内容的提问来源于stack exchange,提问作者Never_se

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 18:12:45