javascript - xhr.withCredentials = true;不适用于 Chrome

标签 javascript google-chrome authentication cookies cross-domain

我在 Chrome 中验证 CORS 请求时遇到问题。

我有在本地主机上运行的单页应用程序和在 Azure 中运行的 Web 服务。我使用 OpenIdConnect 登录。

当我像这样在 EDGE 中向我的后端发出 CORS 请求时,身份验证有效:

$.ajax({
   type: 'get',
   url: buildBackendUrl("api/Account"),
   xhrFields: { withCredentials: true }
});

但是这在 Chrome 中不起作用。当我手动向浏览器输入 web 服务 url 时,请求已通过身份验证。

我检查了 CORS 请求的请求 header ,不同之处在于 cookie:

  • 边缘:ARRAfinity=...; AspNetCore.Cookies=...
  • Chrome:ARRAfinity=...

为什么 Chrome 不包含所有 cookie?

编辑:这里是 fiddler 捕获的请求:

  1. 当我按下登录时重定向:
    myapp.azurewebsites.net/api/Account/login?returnUrl=http://localhost:46563/
  2. 因为我已经登录,所以不需要去登录页面。重定向
    myapp.azurewebsites.net/signin-oidc
  3. 重定向返回:localhost:46563/
  4. 从本地主机制作的 CORS: myapp-dev.azurewebsites.net/api/Account

无论是请求 nr3 还是 4 我都没有看到 cookie。

无论如何,请求 nr2 的响应(myapp.azurewebsites.net/signin-oidc)尝试设置 cookie:

HTTP/1.1 302 Found
Cache-Control: no-cache
Pragma: no-cache
Content-Length: 0
Expires: -1
Location: http://localhost:46563/
Set-Cookie: .AspNetCore.Correlation.OpenIdConnect.3ifhkwCQkMuZkTgBxYiKMOSoLgTX2nIex-8aH-syh5Q=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/signin-oidc; samesite=lax
Set-Cookie: .AspNetCore.OpenIdConnect.Nonce.CfDJ8FG-d2csck1FsQu2pwqnsxLd4w9YWobqchk1w3xMgy7bCX_KilCuRxuj4U0bSTAL-dD_iwdEaZI6pclqlP-3f7QBuKUMS379DFiBPd_tkEkyB_IYVWzJsR1xtw-_qcS1pQL6ial_C2ywbSwRucBxUqtDPMcuFEIomNDDnklpqWUmS_5Xb_tB23Ew7b14M861pL1CtJ18uPqgu-nOgn1RygqhBhMECoQfQ7YhXN_BtfiIbdPfw00jWNfMVc5G1B-SnT_eq80_RmxQ4_JOX3ZJfiI=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/signin-oidc; samesite=lax
Set-Cookie: .AspNetCore.Cookies=...; path=/; samesite=lax; httponly

最佳答案

关于 cookie 政策的新草案称为 SameSite,目前由 Chrome 和 Opera 实现。

基本上,如果您设置 xhr.withCredentials = true,则标记为 SameSite=Strict 的 cookie 不会随 CORS 请求事件一起发送;

为了使其正常工作,您必须禁用特定 cookie 上的 SameSite 策略。对于 ASP.NET Core 2.0 身份验证 cookie,它是:

services.AddAuthentication(...)
    .AddCookie(option => option.Cookie.SameSite = SameSiteMode.None)
    .AddOpenIdConnect(...)

关于javascript - xhr.withCredentials = true;不适用于 Chrome ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46582731/

相关文章:

c# - 在 Asp.Net Core Web API 中使用 MassTransit 消息时如何对用户进行身份验证?

javascript - 前进和后退按钮在插入符号位置处使用react

javascript - Bootstrap容器中的背景色在Electron中不起作用

javascript - 表单控制故障解决方法

javascript - Angular 4/5 - 使用动态配置实例化服务

c# - 使用 AAD 身份验证从带有 MSI 的应用服务向另一个应用服务 API 发出 HTTP 请求

javascript - 跨站脚本注入(inject)

javascript - 使用 ajaxSend 检测正在调用的 jquery ajax 方法

css - 我可以使用 Google Chrome 的开发人员工具调整页面的外观吗?

jquery - 加载器在 chrome 中的同步 ajax 调用期间不工作