2013-12-13 6 views
12

Ho appena iniziato a trafficare con OWIN/Katana e MVC.NET 5.0. Il Visual Studio 2013 ASP.NET Web Application/MVC template predefinito ha un AccountController con un'azione FantaOFootball():Perché AuthenticationManager.SignOut() non riesce quando cambio la risposta?

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

Come previsto, questo funziona bene. Tuttavia, quando cambio il codice di stato della risposta, ad es. da:

Response.SetStatus(HttpStatusCode.SeeOther); 

... Il metodo AuthenticationManager.SignOut() non causa più l'utente a diventare disconnesso. Perché?

Ho provato diversi approcci per l'impostazione del codice di stato HTTP per la risposta, oltre a modificare intestazioni HTTP come Posizione e sempre con lo stesso risultato: l'utente non viene disconnesso quando viene eseguita l'azione LogOff(), se Arrivo al temperamento con la risposta.

non provato ad utilizzare RedirectToAction (che implementa in modo esplicito un redirect 302 - questa è un'altra storia), e non restituire un ActionResult, ma che ha fatto alcuna differenza - non che mi piacerebbe davvero aspettavo che.

Utilizzo di Fiddler Posso dire che la risposta come sembra al browser sembra buona, senza sorprese.

Ho anche provato a cercare il codice sorgente del middleware OWIN al lavoro, ma l'architettura non mi è ancora familiare, e non ho trovato risposte che potessi cogliere lì dentro. Ho bisogno del tuo aiuto per risolvere questo problema, quindi grazie in anticipo!

+0

Quando la risposta ritorna al client in fiddler, si vede il Set-Cookie per rimuovere la vecchia c ookie? –

+0

No. Accetto che questo sia il motivo tecnico per cui l'utente è ancora considerato come connesso. Quello che non capisco è perché la chiamata a SignOut() non dovrebbe dare lo stesso risultato a prescindere se cambio il codice di stato o meno, rimuovendo il cookie e tutto. Potrei rimuovere il cookie da solo, o se volevo un comportamento diverso tutti insieme potrei anche implementare il mio middleware OWIN, ma non lo faccio. Voglio solo un altro codice di stato, che forse è in contraddizione con il comportamento implementato con RedirectToAction, ma perché dovrebbe interessare AuthenticationManager? Sono tornato indietro in questo? –

+0

Dopo la richiesta successiva, l'utente si è disconnesso? –

risposta

7

La ragione AuthenticationManager.SignOut() non è che Response.SetStatus(HttpStatusCode.SeeOther) finisce internamente la risposta:

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

(Vedi System.Web.WebPages.ResponseExtensions)

Dopo questo, naturalmente il ResponseManager non può manipolare la risposta a rimuovere i cookie ecc

2

Questo funziona correttamente con il seguente metodo LogOut, stai facendo qualcosa in modo leggermente diverso?

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

Grazie per la risposta, Hao. Due cose: in primo luogo, il codice sopra non cambia il codice di stato della risposta (che è alquanto fastidioso di per sé). In realtà è ancora una risposta 302 che viene restituita (vedi Fiddler); Secondo, sì, come puoi vedere dal mio codice di esempio, faccio Response.SetStatus (HttpStatusCode.SeeOther); –

+0

Il motivo per cui il codice non funziona è che RedirectToAction() modifica nuovamente il codice di stato in 302. Sono tornato a controllare cosa fa Response.SetStatus() per impedire che ciò accada e in realtà esegue un Response.End() . Se fai lo stesso nel tuo codice, otterrai lo stesso risultato esatto - l'utente non è disconnesso.Ora il motivo è diventato chiaro anche se, naturalmente, AuthenticationManager non può eseguire una disconnessione, rimuovendo i cookie e altro, dopo che la risposta è stata "conclusa", giusto? :) Questa è in realtà la risposta alla mia domanda, immagino ... Non posso credere di aver trascurato questo ... –

+0

Prova questo dopo aver ricordato la tua password .. Non riesce a funzionare (vedi la mia risposta) per risolvere questo – Jimmyt1988