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

如何配置ServiceStack允许非安全HTTP域接收并保存认证Cookie

问题根因

你遇到的问题核心是返回的认证Cookie携带了secure属性,按照浏览器规范,标记为secure的Cookie只能在HTTPS协议的站点中被存储和发送,你前端站点运行在HTTP协议(http://localhost:3000)下,因此浏览器会直接拒绝存储这些Cookie,导致后续请求无认证信息返回401。
你配置了UseSecureCookies = false后仍然返回带secure的Cookie,是因为你的后端服务运行在HTTPS协议下,ASP.NET Core默认会自动为HTTPS响应的Cookie添加secure标识,覆盖了ServiceStack的配置。


解决步骤

  • 第一步:配置ASP.NET Core全局Cookie策略,禁止自动添加Secure标识,在Startup.cs的Configure方法中,UseServiceStack之前添加以下配置:
app.UseCookiePolicy(new CookiePolicyOptions
{
    Secure = CookieSecurePolicy.None,
    MinimumSameSitePolicy = SameSiteMode.Lax
});
  • 第二步:调整ServiceStack的HostConfig配置,确认关闭Secure Cookie,同时设置合理的SameSite规则:
SetConfig(new HostConfig
{
    AddRedirectParamsToQueryString = true,
    DebugMode = AppSettings.Get(nameof(HostConfig.DebugMode), HostingEnvironment.IsDevelopment()),
    UseHttpOnlyCookies = true, // 建议保持开启,防止XSS攻击窃取Cookie
    UseSecureCookies = false,
    SameSiteCookies = SameSiteMode.Lax
});
  • 第三步:检查Auth插件的独立配置,如果你注册AuthFeature时单独配置了Cookie的Secure、SameSite属性,需要修改为和上面一致的规则。
  • 第四步:客户端显式开启跨域携带Cookie的配置,确保请求正确携带存储的认证Cookie:
let client = new JsonServiceClient(environment.apiUrl);
client.withCredentials = true; // 显式开启跨域凭证携带
let req = new Authenticate();
req.userName = email;
req.password = password;
req.rememberMe = rememberMe;

let resp = await client.post(req);

备选方案

如果你仅在开发环境遇到这个问题,更简单的解决方案是将前端站点也切换为HTTPS协议,目前主流前端脚手架(Vite、Create React App等)都支持一键开启HTTPS,不需要修改后端配置即可解决问题。

注意:以上配置仅适用于开发环境,生产环境建议前后端均使用HTTPS协议,开启Secure Cookie以保障安全

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 14:36:04