2015-12-14 30 views
13

Sto sviluppando un asp.net mvc 5 applicazione in cui stavo cercando di reindirizzare al ReturnUrl applicando il codice qui sotto:Server Impossibile aggiungere intestazione dopo intestazioni HTTP sono stati inviati Eccezione a @ Html.AntiForgery

[HttpPost] 
[AllowAnonymous] 
public ActionResult Login(UserLogin model, string returnUrl) 
{ 
    if (ModelState.IsValid) 
    { 
     string EncryptedPassword = GetMD5(model.Password); 
     if (DataAccess.DAL.UserIsValid(model.Username, EncryptedPassword)) 
     { 
      FormsAuthentication.SetAuthCookie(model.Username, true); 
      if (String.IsNullOrEmpty(returnUrl)) 
      { 
       return RedirectToAction("Index", "Home"); 
      } 
      else 
      { 
       Response.Redirect(returnUrl); 
      } 
     } 
     else 
     { 
      ModelState.AddModelError("", "Invalid Username or Password"); 
     } 
    } 
    return View(); 
} 

Il codice sopra funziona perfettamente, ma il problema è che quando invio il modulo di accesso, mi dà un'eccezione che non ho mai affrontato prima e ho difficoltà a risolvere l'eccezione che sta generando nella vista in Login.cshtml, Alla riga:

@Html.AntiForgeryToken() 

E l'Excepti su quello che getta:

Ho studiato molto ma non riesco a raggiungere la conclusione. La mia applicazione funziona correttamente quando rimuovo la riga @ Html.AntiForgeryToken(), ma non voglio farlo, voglio che la mia applicazione rimanga protetta dalla richiesta cross-site.

Qualcuno può aiutarmi, come posso sbarazzarmi di questa eccezione?

+1

Mostra il codice di vista in cui si utilizza la linea @ Html.AntiForgeryToken() – ojf

+0

Il tuo @ Html.AntiForgeryToken() 'nel tuo modulo nella visualizzazione? –

+0

@PedroBenevides Sì, si trova nella forma Begin..Sorry Per la risposta tardiva. –

risposta

42

Quando Response.Redirect(anyUrl) codice lo stato è impostato a 302, e l'intestazione sarà aggiunto alla risposta:

HTTP 1.0 302 Object Moved 
Location: http://anyurl.com 

E quando ViewResult viene eseguito e rasoio rendono la vista della Html.AntiForgeryToken() sarà chiamato, così che l'assistente cerca di aggiungi l'intestazione X-Frame-Options e alcuni cookie alla risposta, è la causa dell'eccezione.

Ma non preoccuparti, è possibile sopprimere l'aggiunta dell'intestazione X-Frame-Options, basta inserire questo AntiForgeryConfig.SuppressXFrameOptionsHeader = true; nello Application_start.

Ma vi suggerisco di cambiare questo:

Response.Redirect(returnUrl); 

a

return Redirect(returnUrl); 

Nota

Dal momento che il codice .NET è stato aperto si può vedere come i AntiForgeryToken opere, vedi qui AntiForgeryWorker

+0

Oh, sì fratello, grazie mille. Ero ancora bloccato su quello. Lo hai inchiodato, seriamente :) Contrassegnato come risposta :) –

+0

@BilalAhmed Quindi è stato utile? Si prega di non dimenticare troppo xD –

+0

Sì, assolutamente, lo era. Ho provato a votare, ma mi hanno detto di aspettare fino a quando non ottengo la reputazione di 15: p –

1

Stavo ottenendo lo stesso errore con Response.Redirect(returnUrl). Dopo il passaggio a Response.Redirect(returnUrl, false) risolto il problema.