我一直在和这个废话争吵太久了。我已经阅读了多篇文章,并且已经看到了大量的Stackoverflow问题,但仍然无法找到明确的答案。
根据我的阅读,对ajax请求的响应可以包含" Set-Cookie"标题反过来被浏览器接受。在对同一域的后续请求中,浏览器应该将cookie发送回服务器。 (假设他们在同一个域名)。
首先,上述是正确的,还是我误解了什么?
其次,假设这是正确的,我在下面的申请中缺少什么?我在Visual Studio 2015中启动了一个新的Empty asp.net项目,并为WEB API添加了组件。然后我做了以下控制器:
public class AuthenticationController : ApiController
{
[Route("api/Authentication/Login/")]
[HttpPost]
public HttpResponseMessage Login([FromBody]CredentialContainer credentials)
{
var response = new HttpResponseMessage();
try
{
var token = Guid.NewGuid().ToString();
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 });
response.StatusCode = HttpStatusCode.OK;
return response;
}
catch (Exception ex)
{
response.StatusCode = HttpStatusCode.InternalServerError;
return response;
}
}
[Route("api/Authentication/DoSomething")]
[HttpGet]
public IHttpActionResult DoSomething()
{
var cookie = Request.Headers.GetCookies();
return Ok();
}
}
public class CredentialContainer
{
public string UserName { get; set; }
public string Password { get; set; }
}
在同一个项目中,我添加了一个HTML页面,其中包含一些简单的JavaScript来调用WEB API。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
</head>
<body>
<button onclick="login()">LogIn</button>
<button onclick="doSomething()">DoSomething</button>
<script>
function login() {
var xhr = new XMLHttpRequest();
var data = { UserName: "user", Password: "password" };
xhr.open("POST", "http://localhost/WebApplication1/api/Authentication/Login/", true);
xhr.setRequestHeader("Content-type", "application/json");
xhr.withCredentials = true;
xhr.onreadystatechange = function () {
if (xhr.readyState === 4) {
if (xhr.status === 200) {
alert(document.cookie);
}
else {
alert("Fail");
}
}
}
xhr.send(JSON.stringify(data));
}
function doSomething() {
var xhr = new XMLHttpRequest();
xhr.open("GET", "http://localhost/WebApplication1/api/Authentication/DoSomething/", true);
xhr.setRequestHeader("Content-type", "application/json");
xhr.withCredentials = true;
xhr.onreadystatechange = function () {
if (xhr.readyState == 4) {
var response = xhr.response;
}
}
xhr.send();
}
</script>
此Web应用程序托管在我的本地IIS(非IIS Express)上。当我单击登录按钮时,会向客户端返回一个响应,其中包含一个&#34; Set-Cookie&#34;头。我已经和Fiddler证实了这一点。但是,浏览器忽略了这一点。每当我通过&#34; doSomething()&#34;方法,cookie不会被发回。我已经使用Fiddler和DoSomething()Web API方法验证了这一点。
我知道通过设置HttpOnly = true,JavaScript无法访问cookie,因此document.cookie将是空白的,但我不明白为什么会阻止浏览器在后续发送它要求。这件事让我机智地结束了。有人可以请问一下这个问题,或者指出一个实际的.NET示例,它实际上是根据请求发送cookie吗?
谢谢
答案 0 :(得分:2)
好的,弄清楚问题出在使用localhost。 Sire为这个问题提供的答案解决了我的问题。