2013-12-13 6 views
12

Ich habe gerade angefangen, mit OWIN/Katana und MVC.NET 5.0 herumzuspielen. Die Standard-Visual Studio 2013 ASP.NET Web Application/MVC-Vorlage hat einen Account mit einer LogOut() Aktion:Warum schlägt AuthenticationManager.SignOut() fehl, wenn ich die Antwort ändere?

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

Wie erwartet, das funktioniert ganz gut. Wenn ich jedoch den Antwortstatuscode z. von:

Response.SetStatus(HttpStatusCode.SeeOther); 

... Die AuthenticationManager.SignOut() -Methode führt nicht mehr den Benutzer abgemeldet werden. Warum das?

Ich habe versucht verschiedene Ansätze für die HTTP-Status-Code für die Antwort, sowie ändern HTTP-Header wie Location, und immer mit dem gleichen Ergebnis - der Benutzer ist nicht abgemeldet, wenn die LogOff() Aktion ausgeführt wird, wenn Ich komme mit der Antwort in Anspannung.

Ich habe versucht, RedirectToAction (die eine 302 Redirect explizit implementiert - das ist eine andere Geschichte) und kein ActionResult zurückgeben, aber das machte keinen Unterschied - nicht, dass ich es wirklich erwarten würde.

Mit Fiddler kann ich sagen, dass die Antwort, wie es dem Browser erscheint gut aussieht, keine Überraschungen hält.

Ich habe auch versucht, den Quellcode der OWIN-Middleware bei der Arbeit durchzusehen, aber die Architektur ist mir immer noch unbekannt, und ich fand keine Antworten, die ich dort erfassen konnte. Ich brauche deine Hilfe beim Aussortieren, also danke im Voraus!

+0

Wenn die Antwort in Fiddler zurück zum Client geht, sehen Sie den Set-Cookie, um das alte c zu entfernen Ookie? –

+0

Nein. Ich stimme zu, dass dies der technische Grund ist, warum der Benutzer weiterhin als angemeldet behandelt wird. Was ich nicht verstehe, ist, warum der Aufruf von SignOut() nicht das gleiche Ergebnis liefern sollte, egal ob ich den Statuscode ändere oder nicht und das Cookie und alle anderen lösche. Ich könnte den Cookie selbst entfernen, oder wenn ich ein ganz anderes Verhalten wollte, könnte ich sogar meine eigene OWIN-Middleware implementieren, aber das tue ich nicht. Ich möchte nur einen anderen Statuscode, der vielleicht dem Verhalten von RedirectToAction widerspricht, aber warum sollte der AuthenticationManager darauf achten? Bin ich alles rückwärts in diesem? –

+0

Ist der Benutzer nach der nächsten Anfrage abgemeldet? –

Antwort

7

Der Grund AuthenticationManager.SignOut() versagt ist, dass Response.SetStatus(HttpStatusCode.SeeOther) intern die Antwort endet:

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

(Siehe System.Web.WebPages.ResponseExtensions)

Danach wird natürlich die ResponseManager kann nicht die Antwort manipulieren Cookies entfernen usw.

2

Das funktioniert für mich mit der folgenden LogOut-Methode, machen Sie etwas etwas anders?

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

Danke für Ihre Antwort, Hao. Zwei Dinge: Erstens ändert der obige Code nicht den Statuscode der Antwort (was an sich etwas nervig ist). Es ist tatsächlich immer noch eine 302 Antwort, die zurückgegeben wird (siehe Fiddler); Zweitens, ja, wie Sie aus meinem Beispielcode sehen können, mache ich Response.SetStatus (HttpStatusCode.SeeOther); –

+0

Der Grund, warum Ihr Code nicht funktioniert, ist, dass RedirectToAction() den Statuscode erneut in 302 ändert. Ich ging zurück, um zu überprüfen, was Response.SetStatus() tut, um dies zu verhindern, und es führt tatsächlich eine Response.End() . Wenn Sie dasselbe in Ihrem Code tun, erhalten Sie genau das gleiche Ergebnis - der Benutzer wird nicht ausgeloggt.Jetzt ist der Grund klar geworden - natürlich kann der AuthenticationManager keine Abmeldung durchführen, Cookies und andere Sachen entfernen, nachdem die Antwort "beendet" wurde, richtig? :) Dies ist eigentlich die Antwort auf meine Frage, ich denke ... Kann nicht glauben, dass ich das übersehen habe ... –

+0

Versuchen Sie dies nach der Erinnerung an Ihr Passwort .. Es funktioniert nicht (siehe meine Antwort), um dies zu beheben – Jimmyt1988