2017-01-03 16 views
0

私はあまりにも長い間このナンセンスと戦ってきました。私は複数の記事を読んで、Stackoverflowの質問をたくさん見ましたが、まだ決定的な答えを見つけることができません。ajaxリクエストで「Set-Cookie」ヘッダーが無視されるのはなぜですか?

私が読んだところから、ajaxリクエストへの応答には、ブラウザが受け入れる「Set-Cookie」ヘッダーを含めることができます。同じドメインへの後続のリクエストでは、ブラウザはクッキーをサーバに送り返すことになっています。 (彼らは同じドメインにいると仮定します)。

まず、上記は正しいか、私は何か誤解していますか?

第2に、これが正しいと仮定すると、私は以下のアプリケーションから何が欠けていますか? 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; } 
} 

同じプロジェクトでは、簡単なJavaScriptを使って1つのHTMLページを追加して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(NOT IIS Expressの)上でホストされています。ログインボタンをクリックすると、「Set-Cookie」ヘッダーを含む応答がクライアントに返されます。私はこれをFiddlerと検証しました。しかし、ブラウザはこれを無視します。私が "doSomething()"メソッドでリクエストを返すと、そのクッキーは返されません。私はこれをFiddlerとDoSomething()Web APIメソッドで検証しました。

私はHttpOnly = trueを設定することによってJavaScriptがクッキーにアクセスできないことを知っています。したがって、document.cookieは空白になりますが、ブラウザが後続のリクエストでブラウザを送信するのを止める理由はわかりません。私はこのもので私の知恵の終わりです。誰かが問題を明らかにしたり、要求に応じて実際にクッキーを送信する.NETの実例を指摘してくれますか?

は、[OK]を

答えて

関連する問題