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

使用Fetch调用.NET Core 6 API时未发送HttpOnly JWT Cookie问题

解决跨域Fetch请求不发送HttpOnly Refresh Token Cookie的问题

以下是针对你的场景的具体解决方案,按优先级排查:

1. 前端Fetch必须指定credentials: 'include'

跨域请求时,浏览器默认不会携带Cookie,必须显式开启凭据传递。修改你的Fetch代码:

fetch('https://localhost:7121/api/auth/refresh', {
  method: 'POST',
  credentials: 'include', // 关键:跨域时强制发送Cookie
  headers: {
    'Content-Type': 'application/json'
    // 无需手动添加Cookie,浏览器会自动处理HttpOnly类型的Cookie
  }
})
.then(response => response.json())
.then(data => console.log(data))
.catch(err => console.error(err));

2. .NET Core API端正确配置CORS

必须允许凭据传递,且不能使用AllowAnyOrigin()(会与AllowCredentials()冲突),需指定精确的前端Origin:

// Program.cs 中配置CORS策略
builder.Services.AddCors(options =>
{
    options.AddPolicy("AllowFrontend", policy =>
    {
        policy.WithOrigins("http://localhost:5500") // 精确指定前端地址
              .AllowAnyHeader()
              .AllowAnyMethod()
              .AllowCredentials(); // 允许跨域传递凭据(Cookie)
    });
});

// 注意中间件顺序:UseCors要放在UseRouting之后、UseAuthorization之前
app.UseRouting();
app.UseCors("AllowFrontend"); // 启用配置好的CORS策略
app.UseAuthorization();

3. 调整Cookie的Secure和SameSite属性

你的API是HTTPS,但前端是HTTP环境,Secure=true的Cookie仅能在HTTPS请求中发送,前端HTTP下浏览器会拒绝发送这类Cookie。分环境配置:

  • 开发环境:将Secure设为false,SameSite设为Lax(避免SameSite=None必须配合Secure的限制)
  • 生产环境:确保前端也使用HTTPS,再设置Secure=true + SameSite=None

示例代码:

var cookieOptions = new CookieOptions
{
    HttpOnly = true,
    // 开发环境设为false,生产环境改为true
    Secure = app.Environment.IsProduction(), 
    Expires = expireTime,
    // 跨域场景:生产环境用None(需配合Secure=true),开发环境用Lax
    SameSite = app.Environment.IsProduction() ? SameSiteMode.None : SameSiteMode.Lax
};

Response.Cookies.Append("refresh_token", refreshTokenValue, cookieOptions);

4. 检查浏览器隐私设置

部分浏览器默认阻止第三方Cookie,即使是localhost也可能触发。可临时设置允许所有Cookie测试:

  • Chrome:设置 > 隐私和安全 > Cookie及其他网站数据 > 选择"允许所有Cookie"
  • 测试后再恢复原有设置,生产环境建议配合HTTPS和SameSite=None避免此问题

5. 验证Cookie的Path和Domain

确保Cookie的Path为/(默认值),这样所有API接口都能匹配。Domain留空即可(localhost下不同端口属于不同域,手动设置Domain反而可能导致Cookie无法被识别)。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 04:50:28