2017-10-05 407 views
0

我在Chrome中验证CORS请求时遇到问题。xhr.withCredentials = true;在Chrome中不起作用

我已经在Azure中运行的localhost和webservices上运行单个页面应用程序。我使用OpenIdConnect登录。

当我在EDGE CORS请求我的后端这样的,认证工作:

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

但同样也不在Chrome工作。当我手动输入webservice url到浏览器时,请求被认证。

我检查请求头的CORS请求,所不同的是在饼干:

  • 边缘: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. CORS: myapp-dev.azurewebsites.net/api/Account

在既,要求NR 3或4我没有看到饼干。

无论如何,请求NR 2(myapp.azurewebsites.net/signin-oidc)的响应试图套饼干:

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 
+0

而不可能告诉那些简短片段......我想你首先托运这些Cookie是否设在Chrome浏览器开始? – CBroe

+0

所以要清楚的是,这是关于为'localhost'域设置的Cookie,并且您期望发送 - 何时准确地到达哪里? – CBroe

+0

我检查过在铬设置中允许使用第三方Cookie。我希望我发送的'.AspNetCore.Cookies = ...'与本地主机的请求到'myapp.azurewebsites.net/api/Account'。不过,我不能100%确定这些cookies来自哪里。我想这些是由myapp.azurewebsites生成的。net/signin-oidc并设置为本地主机 – Liero

回答

0

即使世界上的cookie政策新草案,呼吁SameSite,目前Chrome和Opera实现。

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

为了使其工作,您必须禁用特定cookie的SameSite策略。在ASP.NET 2.0的核心饼干authetication的情况下,它是:

services.AddAuthentication(...) 
    .AddCookie(option => option.Cookie.SameSite = SameSiteMode.None) 
    .AddOpenIdConnect(...) 
相关问题