localhost cookie未设置

时间:2015-02-18 12:30:12

标签: asp.net-mvc cookies 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;
}

服务器的响应如下:

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

但是,当我在Chrome中的“资源”标签中的“Cookie”下,没有设置任何内容。此外,当我向服务器发送请求时,标题中没有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

3 个答案:

答案 0 :(得分:2)

我今天遇到了这个问题,Gaui的回答对我来说非常有用,请记住,理想情况下,您不想对来自任何站点的CORS请求打开服务器。我在开发环境中,我的服务器和客户端来自不同的来源,因为它们位于本地主机的不同端口上。我也在使用.net core 3.0

我的问题是由于我的服务器未将Cookie发送到我的客户端而导致的,因为我的CORS设置阻止了Cookie向我的域的发送,这是服务器未使用标头Access-Control-Allow-Credentials: true所证明的。为解决此问题,我在Startup.cs中将服务器配置为允许来自客户端的请求允许凭据(凭据为a cookie's authorization headers or TLS client certificates)。

        var allowedOrigins = new[] {"localhost:3000"}; // Ideally comes from appsettings

        app.UseCors(builder =>
            builder.WithOrigins(allowedOrigins).AllowCredentials().AllowAnyMethod().AllowAnyHeader().Build());

对于cookie选项;我发现,您不必设置Domain,即使站点未使用https,Secure也可以使用。

Google chrome现在在本地主机上支持cookie,我相信它不像以前那样,因为许多较早的SO帖子都遇到了该问题的用户。

在客户端,您需要将其配置为也接受cookie,如上面Gaui的回答所示。我使用的是fetch,因此必须添加选项:

credentials: 'include'

哪个告诉fetch跨域检索Cookie。参见docs here

答案 1 :(得分:0)

我非常怀疑localhost不是有效的域名,因此Chrome会拒绝它。如果你只是删除&#39; domain = localhost&#39;从Set-Cookie然后它将工作,Chrome将为您分配域localhost。

我个人会创建一个本地域名,例如&#34; test.dev&#34;并将其添加到Windows主机文件127.0.0.1 test.dev

答案 2 :(得分:-2)

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

在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 app config功能中,您可以执行以下操作:

$httpProvider.defaults.withCredentials = true;

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

希望这有助于其他人在努力解决这个问题。