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