2017-10-05 12 views
0

J'ai un problème d'authentification de la requête CORS dans Chrome.xhr.withCredentials = true; ne fonctionne pas en chrome

J'ai une application page unique s'exécutant sur localhost et webservices fonctionnant dans Azure. Je me connecte en utilisant OpenIdConnect.

Quand je demande CORS en EDGE à mon back-end comme celui-ci, l'authentification fonctionne:

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

mais le même ne fonctionne pas dans Chrome. Lorsque je saisis l'URL du service web pour naviguer manuellement, la requête est authentifiée.

J'ai examiné les en-têtes de demande de la demande CORS et la différence est dans les cookies:

  • bord: ARRAfinity=...; AspNetCore.Cookies=...
  • Chrome: ARRAfinity=...

Pourquoi Chrome ne comprend pas tous les cookies?

EDIT: voici demande attrapée par Fiddler:

  1. REDIRECT quand je presse connexion:
    myapp.azurewebsites.net/api/Account/login?returnUrl=http://localhost:46563/
  2. Depuis que je suis déjà connecté pas besoin d'aller à la page de connexion. Rediriger
    myapp.azurewebsites.net/signin-oidc
  3. RETOUR REDIRECT: localhost:46563/
  4. CORS fabriqués à partir Localhost: myapp-dev.azurewebsites.net/api/Account

Dans aucun des deux, RN3 demande ou 4 Je ne vois pas les cookies.

Quoi qu'il en soit, la réponse de nr2 demande (myapp.azurewebsites.net/signin-oidc) tente de cookies ensembles:

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

plutôt impossible de dire avec ces courts extraits ... Je suppose que vous avez d'abord vérifié si ces cookies sont _SET_ dans Chrome pour commencer? – CBroe

+0

Donc, pour être clair, il s'agit de l'ensemble de cookies pour le domaine 'localhost', et vous vous attendez à ce que ce soit envoyé - quand exactement, où? – CBroe

+0

J'ai vérifié que les cookies tiers de chrome sont autorisés dans les paramètres de chrome. Je m'attends à envoyer '.AspNetCore.Cookies = ...' avec la requête faite depuis localhost vers 'myapp.azurewebsites.net/api/Account'. Cependant, je ne suis pas sûr à 100% d'où proviennent ces cookies. Je suppose que les sont générés par myapp.azurewebsites.net/signin-oidc et défini sur localhost – Liero

Répondre

0

Theres nouveau projet sur la politique des cookies, appelé SameSite, actuellement mis en œuvre par Chrome et Opera.

Fondamentalement, les cookies marqués avec SameSite = Strict ne sont pas envoyés avec l'événement de demande CORS si vous définissez xhr.withCredentials = true; Pour que cela fonctionne, vous devez désactiver la politique SameSite sur un cookie particulier. Dans le cas d'ASP.NET Core 2.0 cookie authetication il était:

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