2011-12-22 2 views
7

Nel mio progetto MVC 3 ho una pagina di login che utilizza la logica anti-contraffazione integrato nel MVC 3.ASP.NET MVC 3 sito web anti-contraffazione di token non riesce solo su IE

Su Firefox & Opera funziona bene, ma su IE ottengo questo:

A required anti-forgery token was not supplied or was invalid. 

sono davvero perplesso sul motivo per cui solo IE soffre questo, ho controllato le impostazioni dei cookie e sono impostare lo stesso come gli altri browser quindi sono in un perso qui.

Quando uso il codice anti falso, utilizzo sia un SALE sia il controllo del dominio (che non dovrebbe avere importanza, ma vale la pena di essere detto).

Ecco il codice della vista:

@model login.Models.LogOnModel 

@{ 
    ViewBag.Title = "Log On"; 
} 

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"> </script> 
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script> 

<script type="text/javascript"> 
$(function() { 
    //focus on form. 
    $("#UserName").focus(); 
}); 
</script> 

@using (Html.BeginForm("LogOn", "Account", FormMethod.Post, new { @class = "form login" })) { 
@Html.AntiForgeryToken("[email protected]#Hq4(", ViewBag.AppDomain, "/") 
<div id="box"> 
<h1>Login</h1> 
Please enter your username and password. @Html.ActionLink("Register", "Register") if you don't have an account. 
<div class="block" id="block-login"> 
    <h2> 
     Login Form</h2> 
    <div class="content login"> 
       @Html.ValidationSummary(true) 
     <div class="group buffer"> 
      <div class="left"> 
       <label class="label right"> 
        @Html.LabelFor(m => m.UserName)</label> 
      </div> 
      <div class="right"> 
       @Html.TextBoxFor(m => m.UserName, new { @class = "text_field" }) 
       @Html.ValidationMessageFor(m => m.UserName) 
      </div> 
     </div> 
     <div class="group buffer"> 
      <div class="left"> 
       <label class="label right"> 
        @Html.LabelFor(m => m.Password)</label> 
      </div> 
      <div class="right"> 
       @Html.PasswordFor(m => m.Password, new { @class = "text_field" }) 
       @Html.ValidationMessageFor(m => m.Password) 
      </div> 
     </div> 
     <div class="group buffer"> 
      <div class="left"> 
       <label class="label right"> 
        @Html.LabelFor(m => m.RememberMe)</label> 
      </div> 
      <div class="right"> 
       @Html.CheckBoxFor(m => m.RememberMe) 
      </div> 
     </div> 
     <div class="group navform buffer"> 
      <div class="right"> 
       <button class="button" type="submit"> 
        <img src="@Url.Content("~/Content/images/icons/key.png")" alt="Save" /> 
        Login 
       </button> 
      </div> 
     </div> 
    </div> 
</div> 
</div> 
} 

ViewBag.AppDomain è un valore da web.config per l'impostazione facile durante i test e la produzione di utilizzo.

Se rimuovo il dominio e la porzione di percorso dal tag antifora, funziona perfettamente. Quindi uno di questi due deve essere il problema.

+1

potete inserire il codice di vista ? –

+0

Ciao, quale versione di IE stai usando? –

+0

Sei in grado di (usando gli strumenti di sviluppo di IE, Firebug Lite o Fiddler) scoprire se la tua richiesta 'POST' sta inviando il cookie di AntiForgery? – isNaN1247

risposta

0

Non la mia idea preferita, ma fino a che non riesco a capire questo fuori ho tirato fuori i parametri di dominio e un percorso che rende IE felice.

Se qualcuno ha un suggerimento, sono aperto, ma per ora mi accontento solo di salare il token.

Grazie a tutti per il vostro aiuto.

+0

Puoi spiegare cosa intendi con la rimozione dei parametri del dominio e del percorso? Su cosa? Ho riscontrato questo problema e non sono in grado di risolverlo finora. – Termato

+1

sul controller, è possibile impostare il dominio tramite un attributo, l'ho rimosso da lì. Pubblicheremo il codice ma questa app è stata creata da molto tempo e da allora mi sono trasferita. – Eman

6

Ho avuto un problema simile a questo quando uso un creatore di token AntiCSRF personalizzato. Non stavo usando MVC3 ma potrebbe essere un problema con il simulatore.

Il problema per me era che il nome di dominio che stavo usando localmente per testare il sito aveva un trattino basso. In teoria un nome DNS non può avere un trattino basso (anche se un "nome computer" può), quindi IE non stava salvando i cookie.

Potrebbe non essere lo stesso problema, ma potrebbe essere qualcosa correlato a un ambiente di test e il modo in cui i cookie vengono modificati da IE.

Questo è un articolo molto interessante sui componenti interni di gestione dei cookie di IE che potrebbe aiutarti a scoprire il problema.

http://blogs.msdn.com/b/ieinternals/archive/2009/08/20/wininet-ie-cookie-internals-faq.aspx

+0

il mio dominio è solo localhost durante i test. – Eman

+1

@ php-jquery-programmer oh, vale la pena provare. Potresti trovare utile il collegamento che ha altri suggerimenti utili. –

1

Ho avuto lo stesso problema in un progetto MVC3 costruito in VS2010 e visualizzato tramite IE 11 (funziona perfettamente in Firefox).

Il modo in cui sono riuscito a ottenere intorno era aggiungendo senza cookie = "UseCookies" per l'elemento "forme" nel file web.config nella directory principale:

<authentication mode="Forms"> 
    <forms loginUrl="~/Account/LogIn" timeout="2880" slidingExpiration="true" requireSSL="false" cookieless="UseCookies"/> 
</authentication> 
+0

Utilizzo MVC4 in VS2012 e visualizzazione in IE10. Questo non sembra funzionare per me. Sai perché questo non avrebbe funzionato? È un vero rompicapo. – Termato

+0

Non ho ancora lavorato con MVC4 e VS2012, quindi non so se lo gestisce in un modo diverso. Qualcos'altro che potresti provare sarebbe quello di garantire che l'utente accetti i cookie per il tuo sito web affinché il token anti-contraffazione funzioni. – Ally