Не удалось установить cookie файлы localhost

Я пытаюсь установить файл cookie в своем приложении.

Здесь код, который устанавливает 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 profile

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

    return res;
}

Ответ от сервера следующий:

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

Обратите внимание на следующий заголовок:

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

Однако, когда я перехожу под "Cookies" на вкладке "Ресурсы" в Chrome, ничего не устанавливается. Также, когда я отправляю запрос на сервер, в заголовках нет файлов cookie.

Здесь код, который читает файл cookie:

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

cookie переменная всегда равна нулю.

Мое приложение работает на http://localhost:53998, а служба проверки подлинности работает на http://localhost:60858

Моя версия Chrome - 40.0.2214.111.

Здесь GIF демонстрирует проблему: http://i.imgur.com/q7lkXBz.gif

Изменить: Это, похоже, не относится к Chrome. Это также не работает на FireFox (v35). GIF: http://i.imgur.com/ZewnEtc.gif

Ответ 1

Наконец-то мне удалось решить эту проблему.

В ответе API я должен был добавить заголовки Access-Control-Allow-Credentials: true или добавив следующее в класс WebApiConfig:

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

    config.EnableCors(cors);
}

Затем мне пришлось включить его на стороне клиента, установив свойство withCredentials в объекте XMLHTTPRequest на true. В функции настройки приложения AngularJS вы можете сделать следующее:

$httpProvider.defaults.withCredentials = true;

Кроме того, для Chrome я должен был опустить Domain (или установить его как null).

Надеюсь, это поможет другим бороться с этим.

Ответ 2

Я очень подозреваю, что localhost не является допустимым доменным именем, поэтому Chrome отклоняет его. Если вы просто удалите "domain = localhost" из Set-Cookie, тогда он будет работать, и Chrome назначит вам домен для localhost.

Я лично создал локальное доменное имя типа test.dev и добавлю его в файл хостов Windows, 127.0.0.1 test.dev