2015-02-18 27 views
6

Próbuję ustawić plik cookie w mojej aplikacji.ciasteczka localhost nie ustawione

Oto kod, który ustawia plik cookie:

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; 
} 

Odpowiedź z serwera jest następujący:

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 

Wskazówka następujący nagłówek:

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

Jednak, gdy Przejdę do sekcji "Pliki cookie" na karcie "Zasoby" w przeglądarce Chrome, nic nie jest ustawione. Również podczas wysyłania żądania do serwera w nagłówkach nie ma pliku cookie.

Oto kod, który odczytuje plik cookie:

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

cookie zmienna jest zawsze zerowa.

Moja aplikacja jest uruchomiona na http://localhost:53998 a obsługa uwierzytelniania działa na http://localhost:60858

wersji My Chrome jest 40.0.2214.111.

Oto GIF wykazania problem: http://i.imgur.com/q7lkXBz.gif

Edit: To wydaje się być niespecyficzne Chrome. Nie działa to również w FireFox (v35). GIF: http://i.imgur.com/ZewnEtc.gif

Odpowiedz

-1

W końcu udało mi się to rozwiązać.

W odpowiedzi z interfejsu API musiałem dodać Access-Control-Allow-Credentials: true nagłówki, albo przez dodanie następujących w klasie WebApiConfig:

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

    config.EnableCors(cors); 
} 

Następnie musiałem ją włączyć na stronie klienta, poprzez ustawienie withCredentials właściwość obiektu XMLHTTPRequest do obiektu true. W angularjs funkcji app config można wykonać następujące czynności:

$httpProvider.defaults.withCredentials = true; 

Również dla Chrome, musiałem pominąć Domain (lub ustawić go jako null).

Mam nadzieję, że pomoże to innym walczyć z tym.

+0

EnableCorsAttribute ("*", "*", "*") jest wyjątkowo niebezpieczny i nigdy nie powinien być wykonywany. Wyrzucasz prawie wszystkie zabezpieczenia tego samego pochodzenia i otwierasz użytkowników swojej aplikacji w wielu różnych atakach między witrynami, w tym w przypadku fałszowania nagłówków przeglądarki. Powinieneś precyzyjnie określać domeny, nagłówki i metody, które akceptujesz. –

0

Podejrzewam, że localhost nie jest prawidłową nazwą domeny, dlatego Chrome go odrzuca. Jeśli po prostu usuniesz "domain = localhost" z Set-Cookie, to zadziała, a Chrome przypisze ci domenę do localhosta.

Chciałbym osobiście utworzyć lokalną nazwę domeny jak "test.dev" i dodać go do systemu Windows plik hosts, 127.0.0.1 test.dev

+0

To był kolejny problem, usunięcie nazwy domeny nie działało. Zobacz odpowiedź poniżej. – Gaui

Powiązane problemy