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

ASP.NET Core 8.0 API如何同时验证HttpOnly Cookie与Header双JWT令牌?

要实现同时验证HttpOnly Cookie中的JWT和请求头中的JWT的需求,你需要将两个令牌的认证逻辑拆分为独立的认证方案,并通过授权策略强制要求两个方案都验证通过。以下是具体修改步骤:

1. 拆分认证方案

将原来的混合认证配置拆分为两个独立的JwtBearer认证方案:一个负责读取并验证Cookie中的令牌,另一个负责读取并验证请求头中的令牌。

// 移除默认认证方案,改为配置两个独立的JwtBearer方案
builder.Services.AddAuthentication()
    // 方案1:验证HttpOnly Cookie中的JWT
    .AddJwtBearer("CookieJwt", opt =>
    {
        opt.RequireHttpsMetadata = false;
        opt.SaveToken = true;
        opt.TokenValidationParameters = new TokenValidationParameters
        {
            ValidateIssuerSigningKey = true,
            IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes("myKey")),
            ValidateIssuer = false,
            ValidateAudience = false
        };
        opt.Events = new JwtBearerEvents
        {
            OnMessageReceived = ctx =>
            {
                // 从HttpOnly Cookie中读取令牌
                ctx.Token = ctx.Request.Cookies[Token.TokenKey];
                return Task.CompletedTask;
            }
        };
    })
    // 方案2:验证请求头中的Bearer JWT
    .AddJwtBearer("HeaderJwt", opt =>
    {
        opt.RequireHttpsMetadata = false;
        opt.SaveToken = true;
        opt.TokenValidationParameters = new TokenValidationParameters
        {
            ValidateIssuerSigningKey = true,
            IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes("myKey")),
            ValidateIssuer = false,
            ValidateAudience = false
        };
        // 保持默认逻辑:从Authorization头读取Bearer令牌
    });

2. 创建双令牌授权策略

定义一个授权策略,强制要求两个认证方案都必须验证成功:

builder.Services.AddAuthorizationBuilder()
    .AddPolicy("DualToken", policy =>
    {
        // 指定需要验证的两个认证方案
        policy.AddAuthenticationSchemes("CookieJwt", "HeaderJwt");
        // 自定义断言:确保两个方案的认证结果都为成功
        policy.RequireAssertion(context =>
        {
            var cookieAuthResult = context.AuthenticateAsync("CookieJwt").Result;
            var headerAuthResult = context.AuthenticateAsync("HeaderJwt").Result;
            return cookieAuthResult.Succeeded && headerAuthResult.Succeeded;
        });
    });

3. 应用授权策略

在控制器或全局路由上应用该策略,确保只有双令牌都有效的请求才能访问API:

方法1:在控制器级别应用

[Authorize(Policy = "DualToken")]
[ApiController]
[Route("api/[controller]")]
public class MyController : ControllerBase
{
    // API接口逻辑
}

方法2:全局应用到所有控制器

app.MapControllers().RequireAuthorization("DualToken");

原配置失效原因

你之前的代码将Cookie令牌和请求头令牌的逻辑混合到了同一个JwtBearer方案中:通过OnMessageReceived把Cookie中的令牌当作Bearer令牌使用,导致只要Cookie令牌有效,就会绕过请求头令牌的验证。拆分独立方案后,两个令牌的验证逻辑完全隔离,授权策略会强制检查两者的有效性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 05:05:39