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

如何让JwtBearer同时支持从Cookie与Header获取JWT令牌?

在ASP.NET Core中让JwtBearer支持从Cookie读取令牌

不管是同时兼容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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 23:59:59