本地主机的cookies未设置。

11

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

3
今天我遇到了这个问题,Gaui的回答对我非常有用,尤其要牢记你不希望从任何网站打开你的服务器进行CORS请求。我在我的dev环境中,我的服务器和客户端位于本地主机上的不同端口,因此它们有不同的起源。另外,我正在使用.net core 3.0。
我的问题是由于我的服务器没有向客户端发送cookie,因为我的CORS设置阻止向我的域发送cookie。这可以通过服务器未使用头文件“Access-Control-Allow-Credentials: true”解决。为了解决这个问题,我在启动文件“Startup.cs”中配置了服务器,以允许从我的客户端请求并允许凭据(P.S:凭据是指一个 cookie 的授权头或 TLS 客户端证书 )。
        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支持localhost上的Cookie。许多旧的SO帖子上的用户遇到过这个问题。
在客户端,您还需要配置它以接受Cookie,就像Gaui的答案中所述。例如,在使用fetch时,您需要添加该选项:
credentials: 'include'

这告诉fetch跨域获取cookie。请查看此处的文档


很不幸,在我的情况下不起作用 :( 我检查了我能够检查的一切:现在在本地主机上拥有有效证书,遵循您和其他人的建议... COOKIE未被保存。可能我漏掉了什么。我正在浏览Angular网站,除了IdentityServer和HttpApiHost(我尝试设置cookie的地方)托管在本地主机上并且已经设置了CORS... - Alexander
最后一个点对我有用,我正在使用axios“axios.defaults.withCredentials = true”,但不幸的是它不适用于httponly为true的情况。 - juan carlos peña cabrera

1
我高度怀疑localhost不是有效的域名,因此Chrome会拒绝它。如果你简单地从Set-Cookie中移除“domain=localhost”,那么它就会工作,Chrome会为你分配域名到localhost。
我个人建议创建一个本地域名,例如“test.dev”,并将其添加到您的Windows hosts文件中:127.0.0.1 test.dev。

这是另一个问题,删除域名没有起作用。请参见下面的答案。 - Gaui

-2

我终于成功解决了这个问题。

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

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

    config.EnableCors(cors);
}

然后我需要在客户端上启用它,通过将XMLHTTPRequest对象中的withCredentials属性设置为true。在AngularJS应用程序配置函数中,您可以执行以下操作:

$httpProvider.defaults.withCredentials = true;

另外,对于Chrome浏览器,我不得不省略Domain(或将其设置为null)。

希望这能帮助其他遇到此问题的人。


6
EnableCorsAttribute("", "", "*") 非常危险,永远不应该这样做。你几乎放弃了所有同源策略保护,并向你的应用程序用户敞开了各种跨站攻击的大门,包括涉及浏览器头部伪造的攻击。你应该明确允许哪些域、头信息和方法。 - Alain O'Dea

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接