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

Razor服务部署Linux服务器后响应未返回Set-Cookie Header问题咨询

问题原因梳理

  1. ASP.NET Core环境差异导致Cookie生成策略不同
    本地Windows运行时默认使用Development环境,Cookie的Secure属性默认跟随请求协议,HTTP请求下也会正常返回Set-Cookie头;而Linux部署时默认使用Production环境,ASP.NET Core会默认强制要求Cookie携带Secure属性,仅在HTTPS请求下才会返回Set-Cookie头。你当前Nginx使用HTTP协议转发请求,后端识别到请求为HTTP,直接不生成Set-Cookie头。
  2. CORS配置不符合跨域携带Cookie的要求
    你当前Nginx配置中Access-Control-Allow-Origin设为了通配符*,而浏览器规范明确要求:如果响应需要返回Cookie等凭证信息,Access-Control-Allow-Origin不能使用通配符,必须指定具体的请求源域名,同时必须显式添加Access-Control-Allow-Credentials: true响应头,否则浏览器会自动拦截Set-Cookie头,不会暴露给前端。
  3. 缺少X-Forwarded-Proto头传递导致应用协议判断错误
    你当前Nginx配置没有向后端传递X-Forwarded-Proto头,后端Razor服务无法感知前端实际使用的访问协议,即使后续配置了HTTPS,后端也会认为请求是HTTP,依然不会返回Set-Cookie头。
  4. Cookie的Secure属性与访问协议不匹配
    如果后端返回了携带Secure属性的Cookie,而你通过HTTP协议访问,浏览器也会直接丢弃该Cookie,不会保存使用。

修复步骤

1. 修改Nginx配置

调整location /块的配置,修正CORS规则、补全转发头:

location / {
    # 替换为你的前端实际访问域名,不可用*
    add_header Access-Control-Allow-Origin "https://你的前端域名" always;
    add_header Access-Control-Allow-Methods "POST, GET, OPTIONS, DELETE, PUT" always;
    add_header Access-Control-Allow-Credentials "true" always;
    # 你原有的Access-Control-Allow-Headers配置保留即可,已经包含所需头
    add_header Access-Control-Allow-Headers "Accept, Accept-CH, ...此处保留你原有配置" always;

    proxy_pass http://localhost:5140/;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $remote_addr;
    # 新增两行转发协议、端口信息
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Forwarded-Port $server_port;
}

修改后执行nginx -t校验配置,再执行nginx -s reload重载配置。

2. 后端Razor服务配置转发头支持

在你的ASP.NET Core项目Program.cs最开头添加转发头中间件配置,让服务可以正确识别Nginx传递的协议信息:

// 放在所有服务注册的最前面
builder.Services.Configure<ForwardedHeadersOptions>(options =>
{
    options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
    // 信任本地Nginx的代理请求
    options.KnownProxies.Add(IPAddress.Parse("127.0.0.1"));
});

var app = builder.Build();

// 放在所有中间件的最前面
app.UseForwardedHeaders();

3. 适配访问协议(二选一)

  • 推荐方案:给Nginx配置HTTPS证书,启用443端口HTTPS访问,既符合生产环境安全要求,也匹配Cookie的Secure属性规则。
  • 临时测试方案:如果仅做内网测试不需要HTTPS,可以修改后端Cookie配置,取消强制Secure要求:
    builder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
        .AddCookie(options =>
        {
            // 测试环境关闭Secure强制要求,生产环境不要用这个配置
            options.Cookie.SecurePolicy = CookieSecurePolicy.None;
        });
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 09:33:00