2015-02-18 5 views
6

Ich versuche, einen Cookie in meiner Anwendung zu setzen.localhost Cookies nicht gesetzt

Hier ist der Code, der das Cookie setzt:

HTTP/1.1 200 OK 
Cache-Control: no-cache 
Pragma: no-cache 
Content-Type: application/json; charset=utf-8 
Expires: -1 
Server: Microsoft-IIS/8.0 
Set-Cookie: STUPID-COOKIE=12345; domain=localhost; path=/; httponly 
Access-Control-Allow-Origin: * 
X-AspNet-Version: 4.0.30319 
X-SourceFiles: =?UTF-8?B?QzpcUFJPSkVDVFNcU2Ftc2tpcC5TZXJ2aWNlV2ViTmV3XFNhbXNraXAuQXV0aEFQSVxTYW1za2lwLkF1dGhBUElcbG9naW4=?= 
X-Powered-By: ASP.NET 
Date: Wed, 18 Feb 2015 11:58:07 GMT 
Content-Length: 8019 

Beachten Sie die folgenden Header:

Set-Cookie: STUPID-COOKIE=12345; domain=localhost; path=/; httponly 

Wenn jedoch

public HttpResponseMessage LogIn(UserLoginVM user) 
{ 
    // Do login stuff 

    var cookie = new CookieHeaderValue("STUPID-COOKIE", "12345"); 
    cookie.Domain = Request.RequestUri.Host; 
    cookie.Path = "/"; 
    cookie.HttpOnly = true; 

    // Get user's profile 

    HttpResponseMessage res = Request.CreateResponse<UserProfileVM>(HttpStatusCode.OK, profile); 
    res.Headers.AddCookies(new CookieHeaderValue[] { cookie }); 

    return res; 
} 

Die Antwort vom Server ist Folgendes Ich gehe unter "Cookies" im Tab "Ressourcen" in Chrome, nichts ist eingestellt. Auch wenn ich eine Anfrage an den Server sende, ist kein Cookie in den Headern.

Hier ist der Code, der das Cookie lautet:

CookieHeaderValue cookie = Request.Headers.GetCookies("STUPID-COOKIE").FirstOrDefault(); 

cookie Variable immer null ist.

Meine Anwendung läuft auf http://localhost:53998 und der Authentifizierungsdienst läuft auf http://localhost:60858

Mein Chrome-Version ist 40.0.2214.111.

Hier ist ein GIF demonstriert das Problem: http://i.imgur.com/q7lkXBz.gif

Edit: Dies scheint Chrome nicht-spezifisch. Dies funktioniert auch nicht mit FireFox (v35). GIF: http://i.imgur.com/ZewnEtc.gif

Antwort

-1

Ich habe es endlich geschafft, dies zu lösen.

In der Antwort des API hatte ich Access-Control-Allow-Credentials: true Header hinzufügen, oder indem Sie den folgenden in der WebApiConfig Klasse hinzufügen:

public static void Register(HttpConfiguration config) 
{ 
    var cors = new EnableCorsAttribute("*", "*", "*"); 
    cors.SupportsCredentials = true; 

    config.EnableCors(cors); 
} 

Dann habe ich es auf der Client-Seite aktivieren musste, durch die withCredentials Einstellung Eigenschaft im Objekt XMLHTTPRequest zu true. In AngularJS app Config-Funktion können Sie wie folgt vorgehen:

$httpProvider.defaults.withCredentials = true; 

Auch für Chrome, ich die Domain (oder legen Sie es als null) zu verzichten hatte.

Hoffe das hilft anderen, die damit kämpfen.

+0

EnableCorsAttribute ("*", "*", "*") ist extrem gefährlich und sollte nie gemacht werden. Sie verwerfen nahezu alle Schutzmechanismen derselben Herkunft und öffnen Nutzer Ihrer App für eine Vielzahl von Cross-Site-Angriffen, einschließlich solcher, die Browser-Header-Fälschungen beinhalten. Sie sollten genau angeben, welche Domänen, Header und Methoden Sie zulassen. –

0

Ich vermute sehr, dass localhost kein gültiger Domainname ist, so dass Chrome dies ablehnt. Wenn Sie "domain = localhost" einfach aus dem Set-Cookie entfernen, funktioniert es und Chrome weist die Domain localhost für Sie zu.

Ich persönlich würde erstellen einen lokalen Domain-Namen wie "test.dev" und fügen Sie ihn in Ihre Windows-Hosts-Datei, 127.0.0.1 test.dev

+0

Dies war ein weiteres Problem, das Entfernen des Domänennamens funktionierte nicht. Siehe Antwort unten. – Gaui