我运行 ASP.NET Web api 项目,这是 Docker 容器中的一个微服务。我在另一个容器中有 React + Vite 应用程序。我正在尝试从该微服务发送一个 http cookie 到前端。我可以在 Set-cookie 的响应中看到 cookie,但是我的浏览器拒绝存储它(应用程序 -> Cookies ),并且 cookie 也不存在于请求中。
在我的主机文件中我有:
127.0.0.1 praxeosu.local
127.0.0.1 auth.praxeosu.local
var cookieOptions = new CookieOptions
{
HttpOnly = true,
Secure = true,
SameSite = SameSiteMode.None,
IsEssential = true,
Expires = DateTime.UtcNow.AddHours(3),
Domain = "auth.praxeosu.local" //note I also tried praxeosu.local or with dot at beginning - no success
};
附加到端点中的请求:
Response.Cookies.Append("Bearer", result.Data.Token, result.Data.Cookie);
return Ok();
我的 CORS 设置
builder.Services.AddCors(options =>
{
options.AddPolicy("AllowAll",
builder => builder.AllowAnyMethod()
.WithOrigins("https://praxeosu.local", "https://praxeosu.local:5001", "https://auth.praxeosu.local:5001")
.AllowAnyHeader()
.AllowCredentials());
});
在 React 中,我使用 axios 并将 withCredentials 设置为 true。
我的NGINX:
server {
listen 443 ssl http2;
server_name praxeosu.local;
ssl_certificate /etc/nginx/ssl/praxeosu.local.crt;
ssl_certificate_key /etc/nginx/ssl/private/praxeosu.local.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256";
location / {
root /usr/share/nginx/html;
try_files $uri /index.html;
}
}
# NGINX konfigurace pro Authorization Service API
server {
listen 443 ssl http2;
server_name auth.praxeosu.local;
ssl_certificate /etc/nginx/ssl/praxeosu.local.crt;
ssl_certificate_key /etc/nginx/ssl/private/praxeosu.local.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256";
location / {
proxy_pass https://authorizationservice:5001;
proxy_set_header Host auth.praxeosu.local;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
我有自签名证书,浏览器没有问题,并且显示前端正在安全 https 上运行(当我打开 swagger 时后端也是如此)
但是浏览器仍然没有保存cookie,我不知道问题还出在哪里。 也许这是一个愚蠢的问题,但我对 cookie、react 和 nginx 是新手
谢谢你, 卢卡斯
我尝试更改 cookie 中的域、更改 SameSite 模式等。浏览器仍然拒绝保存 cookie,并将其与请求一起发送回来。
解决方案:
我完全失明了,因为反应没有说出任何一句话。
解决方案是这样的:
const response = await axios.post('/api/v1/auth/login', { email: `${email}@osu.cz`, password: password }, { withCredentials: true });
我必须将 withCredentials 移到单独的括号中。 原来的代码是这样的:
const response = await axios.post('/api/v1/auth/login', {
email: `${email}@osu.cz`,
password: password,
withCredentials: true
});
注意差异。也许它会帮助像我这样盲目的人,无意冒犯:)
谢谢你, 卢卡斯