尽管凭据=“ include”,但每个CORS POST的会话ID都会更改

时间:2019-01-07 15:53:43

标签: javascript c# asp.net-core cors fetch

我想通过CORS将前端网站连接到后端API,该后端API使用简单的身份验证(名称和密码)来授权用户。为此,我使用Javascripts Fetch API。看来即使我使用credentials = "initial",每个提取调用的会话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;
    });
  });
}

我在Configure()的{​​{1}}中添加了以下内容:

AspNetCore-Startup.cs

并转到我的app.UseCors(builder=>builder.AllowAnyOrigin().AllowCredentials().AllowAnyMethod().AllowAnyHeader()); 中的ConfigureServices()

AspNetCore-Startup.cs

我无法使用services.AddCors(); 功能登录。当我使用onClick()而不是credentials: "same-origin"时,我可以登录,但是随后的API调用将更改该调用的会话ID。

如何防止提取呼叫更改会话ID?

编辑: 在我的帐户控制器中,我通过include访问当前会话ID。也许就像服务器会话,而不是请求者会话?

1 个答案:

答案 0 :(得分:0)

会话Cookies与CORS无关。 CORS与对其他域的请求有关。

会话是存储在服务器上的“某些数据”,并由在您的浏览器中存储为cookie的ID标识。

  • 会话初始化:服务器在浏览器中设置cookie(请参阅响应标题)
  • 下一个请求:浏览器将cookie发送到服务器(因此我们的服务器知道要使用哪些数据)

知道这一点,很容易调试问题:

  1. 您的服务器必须发送初始cookie。响应标题中是否有cookie?
  2. 您可以在浏览器中看到Cookie吗?
  3. 客户端是否将所有请求都发送给该cookie?

您可以在浏览器开发人员工具>网络面板中看到此内容。

  

也许这就像服务器会话,而不是请求者会话?

它始终是服务器会话。您的浏览器只是告诉服务器要使用哪个会话(数据)。

您的问题没有提供详细信息,所以我不得不猜测:GDPR可能会阻止asp核心设置会话cookie。

文档:https://docs.microsoft.com/en-us/aspnet/core/security/gdpr?view=aspnetcore-2.2

    services.Configure<CookiePolicyOptions>(options =>
    {
        options.CheckConsentNeeded = context => false;
        ...
    });

可以用作“快速而肮脏的”解决方案。