为什么" Set-Cookie"使用ajax请求忽略标头?

时间:2017-01-03 22:35:55

标签: javascript asp.net ajax cookies

我一直在和这个废话争吵太久了。我已经阅读了多篇文章,并且已经看到了大量的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吗?

谢谢

1 个答案:

答案 0 :(得分:2)

好的,弄清楚问题出在使用localhost。 Sire为这个问题提供的答案解决了我的问题。

Why won't asp.net create cookies in localhost?