如何让JwtBearer同时支持从Cookie与Header获取JWT令牌?
不管是同时兼容Bearer授权头和Cookie,还是仅从Cookie获取,都可以通过自定义JwtBearer的令牌检索逻辑实现,以下是具体方案:
一、同时支持Bearer头和Cookie两种令牌来源
如果需要保留原有Bearer头的调用方式,同时新增Cookie读取支持,只需自定义TokenValidationParameters的TokenRetriever委托,让它依次尝试两种来源:
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { // 保留你原有JWT验证配置(比如Google认证的Authority、Audience) options.Authority = "https://accounts.google.com"; options.Audience = "你的API客户端ID"; options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, ValidateAudience = true, // 其他必要的验证参数... TokenRetriever = request => { // 优先从Bearer授权头取令牌 var headerToken = TokenRetrieval.FromAuthorizationHeader()(request); if (!string.IsNullOrWhiteSpace(headerToken)) { return headerToken; } // 头里没有的话,从指定Cookie读取 return request.Cookies["access_token"]; // 替换成你实际的access token Cookie名称 } }; });
配置后,API会先检查请求的Authorization: Bearer <token>头,若不存在或无效,再尝试读取指定Cookie中的access token,两种方式都能生效。
二、仅从Cookie获取令牌
如果不需要兼容Bearer头,只想让JwtBearer完全依赖Cookie读取令牌,直接把TokenRetriever设置为仅从Cookie取值:
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { // 原有JWT验证配置保留 options.Authority = "https://accounts.google.com"; options.Audience = "你的API客户端ID"; options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, ValidateAudience = true, // 其他必要的验证参数... TokenRetriever = request => request.Cookies["access_token"] }; });
关键注意事项
- 务必确保access token和refresh token的Cookie设置为HttpOnly和Secure(生产环境强制HTTPS),避免XSS攻击;同时合理配置
SameSite属性(如SameSiteMode.Lax),降低CSRF风险。 - 刷新令牌的接口需要从HttpOnly Cookie中读取refresh token,验证后生成新的access token,再将新token写回同名Cookie。
内容的提问来源于stack exchange,提问作者xarielah
相关产品推荐
相关产品推荐

