【问题标题】:xhr.withCredentials = true; does not work in chromexhr.withCredentials = true;在铬中不起作用
【发布时间】:2018-03-16 21:38:56
【问题描述】:

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

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

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

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

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

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

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

为什么 Chrome 不包含所有 cookie?

编辑:这里是提琴手捕获的请求:

  1. 按登录时重定向:
    myapp.azurewebsites.net/api/Account/login?returnUrl=http://localhost:46563/
  2. 因为我已经登录了,所以不需要去登录页面。重定向
    myapp.azurewebsites.net/signin-oidc
  3. 重定向回:localhost:46563/
  4. 由 Localhost 制作的 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

【问题讨论】:

  • 用那些简短的 sn-ps 来判断是不可能的......我想你首先检查了这些 cookie 是否在 Chrome 中设置开始?
  • 所以为了清楚起见,这是关于为 localhost 域设置的 cookie,您希望它被发送 - 确切的时间,发送到哪里?
  • 我已检查 chrome 设置中是否允许 chrome 3rd 方 cookie。我希望我将.AspNetCore.Cookies=... 与从本地主机发出的请求一起发送到myapp.azurewebsites.net/api/Account。但是我不能 100% 确定这些 cookie 是从哪里来的。我猜是由 myapp.azurewebsites.net/signin-oidc 生成并设置为 localhost
  • 好吧,至多最后一个 cookie 应该被发送到myapp.azurewebsites.net/signin-oidc,因为其他两个对于该路径甚至都无效。当你在整个事情之后检查为myapp.azurewebsites.net设置的cookie时,它们都在那里吗?如果浏览器不接受它们,它也不能将它们发回。
  • “我猜是由 myapp.azurewebsites.net/signin-oidc 生成并设置为 localhost” - myapp.azurewebsites.net 无法为 localhost 设置 cookie .. . 将是一个巨大的安全问题,如果有可能的话。

标签: javascript google-chrome authentication cookies cross-domain


【解决方案1】:

关于 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(...)

【讨论】:

    猜你喜欢
    • 2012-09-20
    • 2019-07-09
    • 2020-09-19
    • 2011-11-06
    • 1970-01-01
    • 2019-02-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多