2013-04-15 1 views
12

Sto solo concludendo un progetto universitario, non sono sicuro se ho guardato troppo a lungo il mio computer e mi manca qualcosa di ovvio, ma quando provo per registrare un utente, sto ricevendo un 404 non trovato per l'URL/Account/LogOff.MVC 4 - Azione del controller LogOff che non ha trovato 404

Ho una barra di navigazione che mostra Log in/Log out a seconda che un utente, registrato in, o, disconnesso:

<div class="nav-collapse collapse"> 
    <ul class="nav pull-right"> 
     <li class="dropdown" id="dropdown-login-div"> 
      @if (!Request.IsAuthenticated) 
      { 
       <a class="dropdown-toggle" href="#" data-toggle="dropdown">Sign In <strong class="caret"></strong></a> 
      } 
      else 
      { 
       @Html.ActionLink("Log Off", "LogOff", "Account") 
      } 
      <div class="dropdown-menu" id="dropdown-login"> 
       @Html.Partial("~/Views/Account/_LoginPartial.cshtml", new ViewDataDictionary<LetLord.Models.LoginModel>()) 
      </div> 
     </li> 
    </ul> 
</div> 

Nel mio controller conto l'azione predefinita LogOff che viene fornito con Internet modello:

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult LogOff() 
{ 
    WebSecurity.Logout(); 

    return View("Index"); 
} 

Qualcuno potrebbe dirmi perché questo accada, prima di gettare il portatile contro il muro. Saluti.

risposta

39

si utilizza un collegamento (<a/> tag) per disconnettersi che si traduce in HTTP GET richiesta quando l'utente fa clic su di esso, ma la vostra azione è costretto a servire POST unica richiesta (perché è decorato con l'attributo [HttpPost]) .

È necessario inserire il collegamento in un modulo e generare la richiesta POST oppure rimuovere [HttpPost] e [ValidateAntiForgeryToken] (crediti per GalacticCowboy) dall'azione.

+0

Questo è corretto - e il mio consiglio sarebbe quello di rimuovere il HttpPost piuttosto che la creazione di un modulo per il logout. Dal momento che non stai inviando alcun dato al server, un GET è più appropriato per un'azione di disconnessione. –

+0

'ValidateAntiForgeryToken' fallirà dato che non è un messaggio di posta, anche. – GalacticCowboy

+0

Ho completamente superato la mia testa. Grazie. – MattSull

28

Dal Logout modifica dello stato del server, io non rimuovo [HttpPost] e [ValidateAntiForgeryToken] Invece mi sostituirà il link (tag di ancoraggio) con il seguente

@using (Html.BeginForm("Log Out", "Account", FormMethod.Post, 
new { id = "logoutForm" })) 
{ 

    @Html.AntiForgeryToken() 
    <a href="javascript:document.getElementById('logoutForm').submit()">Log Out</a> 

} 
+0

ottima soluzione, facile da implementare e spiega il problema. Grazie! – Gent

0

mi sono imbattuto in questo problema in un'applicazione legacy . Il modo in cui l'ho risolto era quello di rilevare quando l'Url di ritorno fornito era "/ Account/LogOff" e agire di conseguenza. Dal file 'AccountController.cs', 'Login' metodo:

if (returnUrl == "/Account/LogOff") 
    { 
     return this.RedirectToLocal(null); 
    } 
    else 
    { 
     return this.RedirectToLocal(returnUrl); 
    }