我正在尝试在我的应用程序中设置 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 的“资源”选项卡中进入“Cookie”时,没有设置任何内容。另外,当我向服务器发送请求时, header 中没有 cookie。
下面是读取 cookie 的代码:
CookieHeaderValue cookie = Request.Headers.GetCookies("STUPID-COOKIE").FirstOrDefault();
cookie
变量始终为空。
我的应用程序正在 http://localhost:53998 上运行并且身份验证服务正在 http://localhost:60858 上运行
我的 Chrome 版本是 40.0.2214.111。
这是演示该问题的 GIF: /image/86Xug.gif
编辑:这似乎不是 Chrome 特有的。这在 FireFox (v35) 上也不起作用。 GIF:/image/yFuzd.gif
最佳答案
我今天遇到了这个问题,Gaui 的回答对我来说非常有用,请记住,理想情况下您不想向来自任何站点的 CORS 请求开放您的服务器。我在我的开发环境中,我的服务器和客户端位于不同的来源,因为它们位于本地主机上的不同端口。我也使用 .net core 3.0
我的问题是由于我的服务器没有向我的客户端发送 cookie,因为我的 CORS 设置阻止向我的域发送 cookie,这通过服务器不使用 header Access-Control-Allow-Credentials 可以明显看出:正确
。为了解决这个问题,我在 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
关于asp.net-mvc - 本地主机 cookies 未设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28583729/