.NET 6与React中子域向主域发送Cookie无法访问的问题
核心问题分析
Postman能正常获取Cookie是因为它不受浏览器跨域安全策略限制,而浏览器会严格校验Cookie的Domain、SameSite等属性,你当前的配置存在两个关键错误:
1. 修正Cookie的Domain属性
Cookie的Domain字段不能包含协议前缀(https://),且要设置为能覆盖主域和子域的根域名格式,同时必须配合Secure和SameSite属性适配跨域场景:
TokenHandler tokenHandler = new TokenHandler(configuration); Token token = tokenHandler.CreateAccessToken(user); user.RefreshToken = token.RefreshToken; user.RefrestTokenEndDate = token.Expiration.AddMinutes(3); await context.SaveChangesAsync(); var cookieOptions = new CookieOptions { Expires = DateTime.UtcNow.AddHours(24), Domain = ".batuhanfindik.com", // 根域名格式,主域和所有子域均可访问 Secure = true, // 强制HTTPS下传输,适配SSL配置 SameSite = SameSiteMode.None, // 跨域场景必须设置为None HttpOnly = true // 可选,防止XSS攻击提升安全性 }; Response.Cookies.Append("AccessToken", token.AccessToken, cookieOptions);
若仅需主域
www.batuhanfindik.com访问,可将Domain设为www.batuhanfindik.com,但根域名格式更灵活,支持后续新增子域共享Cookie。
2. 客户端请求必须携带凭证
React发起请求时,必须明确告知浏览器携带Cookie,以axios和fetch为例:
- Axios配置:
axios.post('https://你的子域API地址/login', 登录数据, { withCredentials: true });
- Fetch配置:
fetch('https://你的子域API地址/login', { method: 'POST', credentials: 'include', body: JSON.stringify(登录数据), headers: { 'Content-Type': 'application/json' } });
3. 确保Web API的CORS策略正确配置
ASP.NET Core中需开启允许凭证的CORS策略,指定主域为允许源:
// 服务配置阶段 builder.Services.AddCors(options => { options.AddPolicy("AllowMainDomain", policy => { policy.WithOrigins("https://www.batuhanfindik.com") .AllowAnyHeader() .AllowAnyMethod() .AllowCredentials(); // 必须开启,否则浏览器会拒绝接收Cookie }); }); // 中间件注册阶段(需放在UseRouting之后,UseAuthorization之前) app.UseCors("AllowMainDomain");
内容的提问来源于stack exchange,提问作者Batu han
相关产品推荐
相关产品推荐

