尽管 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.csConfigure() 中添加了以下内容:

app.UseCors(builder=>builder.AllowAnyOrigin().AllowCredentials().AllowAnyMethod().AllowAnyHeader());

还有我的AspNetCore-Startup.csConfigureServices()

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”标头的值为“”,当请求的凭据模式为“包含”时,该值必须为“真”

fetch跨域发送带凭据的请求

Fetch怎么与后端互通Cookie