2016-05-17 4 views
5

Es gibt einen Knotenserver, der beim Akzeptieren der korrekten Anmeldeinformationen eines Benutzers einen Sitzungscookie im Anforderungsheader mit dem Namen set-cookie erstellt und sendet.CORS - Serverseitiger Cookie wird nicht im Chrome-Browser gespeichert

Aber wenn ich eine AJAX-Anfrage von meinem Chrom-Browser die Anfrage akzeptiert, fügt es nicht das Cookie auf der Client-Seite. so, wenn eine neue Anforderung von Client-Seite erzeugt, wird der Server authentifiziert es nicht und wirft 401.

Ich bin verwirrt, ob es sich um ein Browser-Problem oder ein mir fehlt etwas von AJAX-Request

Bitte helfen.

+0

Sie passieren Sie wissen, gegen welchen Domänenserver Cookies erstellt werden? Einer der möglichen Konfliktgründe in der Cookie-Domäne und der Websitedomain. –

+0

einfache cors-Bedürfnisse (die von Drittanbietern) erlauben nicht mit Cookies misten. – dandavis

+0

Können Sie den Code, den Sie für die Ajax-Anfrage verwenden, und die Domänen des Authentifizierungsservers und der Website teilen? Könnte ein CORS-Problem sein, wie @MaheshChavda vorgeschlagen hat; Einige Browser verweigern die Handhabung des 'Set-Cookie'-Headers bei domainübergreifenden Ajax-Anfragen. Sie können möglicherweise die entsprechenden Optionen mit 'credentials' hinzufügen, wie in dieser Antwort vorgeschlagen http://stackoverflow.com/questions/8863571/cors-request-why-are-the-cookies-not-sent/8870830#8870830 oder (mit Winkel): http://stackoverflow.com/questions/19383311/angularjs-http-does-not-seem-to-understand-set-cookie-in-the-response. –

Antwort

2

Danke für Ihre Antworten. Ich versuchte es withCredentials Sache, aber der Sitzungscookie wurde nicht auf meinem lokalen gesetzt.

Der Grund, warum ich herausgefunden habe, war die erlaubte Herkunft. Ich muss die erlaubten Ursprünge im Backend einstellen.

Das XHR von ist eine sichere Anfrage, wenn es mit der Eigenschaft credentials übergeben wird. Der clientseitige Browser speichert den Cookie nur, wenn der erlaubte Ursprung dem Anfrageursprung entspricht.

Also war die einfache Lösung, den Host zu etwas zu ändern, das mit dem erlaubten Ursprung übereinstimmt.

Am Knotenende muss ich origin: 'domain.com' tun und am Frontend muss ich meinen Server (localhost) auf test.domain.com zeigen. und Bingo. Es funktionierte.!

3

Wenn Sie ‚holen‘ verwenden, müssen Sie ein Schlüssel

{ 
     headers: req.headers, 
     credentials: 'include' 
} 
+0

Ich frage mich, wer das davoted, da dies für 'fetch()' absolut korrekt ist. – Anne

+0

@Anne PLZ-Abstimmung, wenn Sie sich fühlen R8 ... – prateekbh

1

hinzufügen Wenn Sie XHR Anfrage verwenden, dann müssen Sie withCredentials auf true gesetzt. Es sollte Problem beheben, wenn keine bitte Code zur Verfügung stellen

+0

Können Sie Ihre Antwort mit einigen Beispielcode erweitern? – ManoDestra

1

Ich habe dieses Problem mit Angular 4 in Chrome (IE funktionierte).

Anforderungen von Client auf localhost: 4200 WebApi auf localhost: 24336. Hatte alle CORS-Setup, "Access-Control-Allow-Credentials" value = "wahr" "Access-Control-Allow-Origin" value = "http: // localhost: 4200" usw. und übergab {withCredentials: true} in jeder Anfrage, zB wie http.post (url, {}, {withCredentials: true}).

Das Update, für mich war die Standard RequestOptions auf {withCredentials: true} setzen, indem Sie die Schritte https://angular.io/api/http/BaseRequestOptions und das Hinzufügen der folgenden Anbieter: in app.module.ts

,{provide: RequestOptions, useClass: MyOptions}