尽管 credentials='include',但每次 CORS POST 的会话 ID 都会更改
Posted
技术标签:
【中文标题】尽管 credentials=\'include\',但每次 CORS POST 的会话 ID 都会更改【英文标题】:Session ID changes at every CORS POST despite credentials='include'尽管 credentials='include',但每次 CORS POST 的会话 ID 都会更改 【发布时间】:2019-06-02 07:24:09 【问题描述】:我想通过 CORS 将我的前端网站连接到我的后端 API,该 API 使用简单的身份验证(名称和密码)来授权用户。为此,我使用 javascripts Fetch API。即使我使用credentials = "initial"
,每个 fetch 调用的会话 ID 似乎也会发生变化:
function onClick()
const url = 'https://localhost:44394/api/account/Login/Standard/P@$$w0rd';
fetch(url,
method: 'POST',
credentials: 'include',
mode: 'cors'
).then(function (response)
return response.text().then(function (text)
document.getElementById("at").innerhtml = text;
);
);
我在AspNetCore-Startup.cs
的Configure()
中添加了以下内容:
app.UseCors(builder=>builder.AllowAnyOrigin().AllowCredentials().AllowAnyMethod().AllowAnyHeader());
还有我的AspNetCore-Startup.cs
ConfigureServices()
:
services.AddCors();
我无法使用onClick()
-函数登录。当我使用 credentials: "same-origin"
而不是 include
时,我可以登录,但随后的 API 调用会更改调用的会话 ID。
如何防止 Fetch 调用更改会话 ID?
编辑:
在我的帐户控制器中,我通过HttpContext.Session
访问当前会话 ID。也许这类似于服务器会话而不是请求者会话?
【问题讨论】:
【参考方案1】:会话 Cookie 与 CORS 无关。 CORS 是关于对其他域的请求。
会话是存储在服务器上的“一些数据”,由存储在浏览器中的 cookie 的 ID 标识。
会话初始化:服务器在浏览器中设置 cookie(参见响应标头) 下一个请求:浏览器将 cookie 发送到服务器(因此我们的服务器知道要使用哪些数据)知道了这一点,问题就很容易调试了:
-
您的服务器必须发送初始 cookie。响应标头中是否有 cookie?
您能在浏览器中看到 cookie 吗?
客户端是否会随所有请求发送此 cookie?
您可以在浏览器的开发者工具 > 网络面板中看到这一点。
也许这类似于服务器会话而不是请求者会话?
它总是并且只有服务器会话。您的浏览器只是告诉服务器使用哪个会话(数据)。
您的问题没有提供有关发生情况的详细信息,因此我不得不猜测:GDPR 可能会阻止 asp core 设置会话 cookie。
文档:https://docs.microsoft.com/en-us/aspnet/core/security/gdpr?view=aspnetcore-2.2
services.Configure<CookiePolicyOptions>(options =>
options.CheckConsentNeeded = context => false;
...
);
可以作为“快速而肮脏”的解决方案。
【讨论】:
以上是关于尽管 credentials='include',但每次 CORS POST 的会话 ID 都会更改的主要内容,如果未能解决你的问题,请参考以下文章
React fetch,“credentials: include”,破坏了我的整个请求,我得到一个错误
Ant Design Pro umi-request credentials: include 跨域问题
AMP Access-Control-Allow-Credentials错误
响应中“Access-Control-Allow-Credentials”标头的值为“”,当请求的凭据模式为“包含”时,该值必须为“真”