我有一个用C#编写的WEB API。我有一个登录方法,成功验证后设置Set-Cookie标头。我可以通过使用Fiddler验证这是否在响应中发送。
var cookie = new CookieHeaderValue("access_token", token);
cookie.Expires = DateTimeOffset.Now.AddDays(1);
cookie.Domain = Request.RequestUri.Host;
cookie.Path = "/";
cookie.HttpOnly = true;
response.Headers.AddCookies(new CookieHeaderValue[] { cookie });
Set-Cookie:access_token = XXXXXXX.XXXXXXX.XXXXXX; expires = Fri,2016年12月23日22:36:46 GMT;域本地主机=;路径= /
问题是浏览器/ JavaScript只是忽略了" Set-Cookie"头。当我回复请求时,cookie永远不会被发送。我认为这可能是一个CORS问题。前端和WEB API都在localhost上运行,但它们在不同的端口上运行。
我已将以下内容添加到我的web.config。
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Headers" value="Content-Type, *" />
<add name="Access-Control-Allow-Methods" value="POST,GET,OPTIONS,PUT,DELETE" />
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Credentials" value="true" />
</customHeaders>
</httpProtocol>
这对解决问题毫无帮助。下面是我的JavaScript。
身份验证:
var xhr = new XMLHttpRequest();
var data = { UserName: "user", Password: "password" };
xhr.open("POST", "TheURL", true);
xhr.setRequestHeader("Content-type", "application/json");
xhr.withCredentials = true;
xhr.onreadystatechange = function () {
if (xhr.readyState === 4) {
if (xhr.status === 200) {
//Success
}
else {
//Failure
}
}
}
xhr.send(JSON.stringify(data));
}
成功验证后尝试执行GET操作:
var xhr = new XMLHttpRequest();
xhr.open("GET", "TheURL", true);
xhr.setRequestHeader("Content-type", "application/json");
xhr.withCredentials = true;
xhr.onreadystatechange = function () {
if (xhr.readyState == 4) {
//Do stuff with the data
}
else {
//Deal with the error
}
}
xhr.send(); //No Cookie is sent.
从我读过的所有内容中,这应该只是自动运行,但事实并非如此。 GET一下子就像Set-Cookie从未存在过一样。我错过了什么?
更新
我改变了
<add name="Access-Control-Allow-Origin" value="*" />
到
<add name="Access-Control-Allow-Origin" value="http://localhost:MyPortNumber" />
后续请求仍然没有发送cookie。我真的不明白为什么这需要这么困难。有人能指出我的工作代码演示这个例子吗?我已经关注了很多关于这个主题的文章,却找不到真正有效的答案。