2013-12-13 28 views
12

私は、OWIN/KatanaとMVC.NET 5.0を使い始めました。なぜ応答を変更するとAuthenticationManager.SignOut()が失敗するのですか?

public ActionResult LogOff() { 
    AuthenticationManager.SignOut(); 
    return RedirectToAction("Index", "Home"); 
} 

予想したように、これはうまく動作します:デフォルトのVisual Studio 2013は、ASP.NET Webアプリケーション/ MVCテンプレートは、ログアウト()アクションでAccountControllerを持っています。ただし、応答ステータスコードを変更すると、たとえばby:

Response.SetStatus(HttpStatusCode.SeeOther); 

... AuthenticationManager.SignOut()メソッドによって、ユーザーはログオフされなくなりました。何故ですか?

レスポンスのhttpステータスコードを設定したり、Locationのようなhttpヘッダーを変更したり、常に同じ結果を得るために、さまざまなアプローチを試みました.LogOff()アクションが実行されたときにユーザーはログオフされません。私はその反応で焼き払いに入る。

RedirectToAction(別の話である302リダイレクトを明示的に実装しています)を使用せず、ActionResultを返さなかったが、違いはありませんでした。

Fiddlerを使用すると、ブラウザに表示されるレスポンスが驚くようなものではないことがわかります。

私はOWINミドルウェアのソースコードを調べてみましたが、アーキテクチャーはまだ私には慣れていませんでした。そこで私がそこで把握できる答えは見つかりませんでした。私はこれを整理する際にあなたの助けが必要なので、事前に感謝します!

+0

レスポンスがフィドラーでクライアントに返されると、Set-Cookieが表示されて古いcを削除しますかおい? –

+0

いいえ。これは、ユーザーが引き続きログオンしているように扱われている技術的理由に合致します。私が得られないのは、ステータスコードを変更するかどうかにかかわらず、SignOut()への呼び出しが同じ結果を返さないようにして、クッキーとすべてを削除することです。私は自分でクッキーを削除することができました。もし私が別の振る舞いをまとめたいのであれば、自分のOWINミドルウェアを実装することもできますが、私はそうしません。私はちょうどRedirectToActionで実装された振る舞いと矛盾するかもしれない別のステータスコードを欲しがっていますが、なぜAuthenticationManagerが気にする必要がありますか?私はすべてこれの後方にいるのですか? –

+0

次の要求の後、ユーザーはログオフしていますか? –

答えて

7

AuthenticationManager.SignOut()が失敗した理由は、Response.SetStatus(HttpStatusCode.SeeOther)が内部的応答を終了していることである:

public static void SetStatus(this HttpResponseBase response, int httpStatusCode) 
{ 
    response.StatusCode = httpStatusCode; 
    response.End(); 
} 

System.Web.WebPages.ResponseExtensionsを参照)この後

、自然ResponseManagerは、クッキーを削除するには、応答を操作することはできませんなど

2

これは私にとっては、次のLogOutメソッドでうまくいきます。若干違うやり方をしていますか?

// 
    // POST: /Account/LogOff 
    [HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult LogOff() 
    { 
     Response.StatusCode = 303; 
     AuthenticationManager.SignOut(); 
     return RedirectToAction("Index", "Home"); 
    } 
+0

あなたの返信ありがとう、ハオ。 2つのこと:まず、上記のコードはレスポンスのステータスコードを変更しません(これはやや厄介です)。それは実際には依然として返される302応答です(Fiddlerを参照)。第二に、はい、私の例のコードから見ることができるように、私はResponse.SetStatus(HttpStatusCode.SeeOther)を行います。 –

+0

あなたのコードが動作しない理由は、RedirectToAction()がステータスコードを再び302に変更することです。Response.SetStatus()がこれを防止するために何をチェックして、実際にResponse.End() 。あなたのコードで同じことをしても、まったく同じ結果が得られます - ユーザーはログアウトしていません。理由は明らかですが、もちろんAuthenticationManagerは、応答が「終了」された後に、クッキーやものを削除してサインアウトを実行することはできません。 :)これは実際に私の質問への答え、私は推測する...私はこれを見逃したと信じることはできません... –

+0

パスワードを覚えて後に試してください..これを解決するために(私の答えを参照してください)動作しません – Jimmyt1988

関連する問題