localhost cookie未设置

Gau*_*aui 7 cookies asp.net-mvc 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's profile

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

    return res;
}
Run Code Online (Sandbox Code Playgroud)

服务器的响应如下:

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
Run Code Online (Sandbox Code Playgroud)

请注意以下标题:

Set-Cookie: STUPID-COOKIE=12345; domain=localhost; path=/; httponly
Run Code Online (Sandbox Code Playgroud)

但是,当我在Chrome中的"资源"标签中的"Cookie"下,没有设置任何内容.此外,当我向服务器发送请求时,标题中没有cookie.

这是读取cookie的代码:

CookieHeaderValue cookie = Request.Headers.GetCookies("STUPID-COOKIE").FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)

cookie 变量始终为null.

我的应用程序在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

Gau*_*aui -2

我终于设法解决了这个问题。

在 API 的响应中,我必须添加Access-Control-Allow-Credentials: true标头,或者在 WebApiConfig 类中添加以下内容:

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

    config.EnableCors(cors);
}
Run Code Online (Sandbox Code Playgroud)

然后我必须在客户端启用它,方法是将对象withCredentials中的属性设置XMLHTTPRequesttrue. 在 AngularJS 应用程序配置功能中,您可以执行以下操作:

$httpProvider.defaults.withCredentials = true;
Run Code Online (Sandbox Code Playgroud)

另外,对于 Chrome,我必须省略Domain(或将其设置为 null)。

希望这可以帮助其他为此苦苦挣扎的人。

  • EnableCorsAttribute("*", "*", "*") 非常危险,永远不应该这样做。您抛弃了几乎所有同源策略保护,并使应用程序的用户面临各种跨站点攻击,包括涉及浏览器标头伪造的攻击。您应该明确您允许的域、标头和方法。 (6认同)