未设置本地主机 cookie

localhost cookies not set

我正在尝试在我的应用程序中设置 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

注意以下内容header:

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

但是,当我在 Chrome 的 "Resources" 选项卡中进入 "Cookies" 下时,没有任何设置。此外,当我向服务器发送请求时,headers 中没有 cookie。

这是读取 cookie 的代码:

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

cookie 变量始终为空。

我的申请是 运行 http://localhost:53998 and the authentication service is running on http://localhost:60858

我的 Chrome 版本是 40.0.2214.111.

这是演示问题的 GIF: http://i.imgur.com/q7lkXBz.gif

编辑: 这似乎是 non-specific 到 Chrome。这在 FireFox (v35) 上也不起作用。动图:http://i.imgur.com/ZewnEtc.gif

我终于解决了这个问题。

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

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

    config.EnableCors(cors);
}

然后我必须在 client-side 上启用它,方法是将 XMLHTTPRequest object 中的 withCredentials 属性 设置为 true .在 AngularJS 应用程序配置功能中,您可以执行以下操作:

$httpProvider.defaults.withCredentials = true;

此外,对于 Chrome,我不得不省略 Domain(或将其设置为空)。

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

我高度怀疑 localhost 不是有效域名,因此 Chrome 拒绝了。如果您只是从 Set-Cookie 中删除 'domain=localhost' 那么它将起作用并且 Chrome 将为您将域分配给本地主机。

我会亲自创建一个像 "test.dev" 这样的本地域名,并将其添加到您的 Windows 主机文件中,127.0.0.1 test.dev

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

我的问题是由于我的服务器没有向我的客户端发送 cookie,因为我的 CORS 设置阻止向我的域发送 cookie,服务器没有使用 header 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