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
相关产品推荐
相关产品推荐

