Не удалось установить 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