2017-07-18 2 views
1

J'ai mis à jour notre code MVC de la version 2.0 vers la version 4.0. Et maintenant, j'obtiens l'erreur suivante: "Un jeton anti-falsification requis n'était pas fourni ou était invalide."AntiForgeryToken est invalide

J'ajoute le code ci-dessous dans ValidateAntiForgeryTokenAttribute.cs:

public void OnAuthorization(AuthorizationContext filterContext) 
    { 
     if (filterContext == null) 
     { 
      throw new ArgumentNullException("filterContext"); 
     } 

     string httpMethodOverride = filterContext.HttpContext.Request.GetHttpMethodOverride(); 
     if (!this.verbs.Verbs.Contains(httpMethodOverride, StringComparer.OrdinalIgnoreCase)) 
     { 
      return; 
     } 

     AntiForgeryDataSerializer antiForgeryDataSerializer = new AntiForgeryDataSerializer(); 
     AntiForgeryData antiForgeryData = new AntiForgeryData(); 
     string fieldName = antiForgeryData.GetAntiForgeryTokenName(null); 
     string cookieName = antiForgeryData.GetAntiForgeryTokenName(filterContext.HttpContext.Request.ApplicationPath); 


     HttpCookie cookie = filterContext.HttpContext.Request.Cookies[cookieName]; 

     if (cookie == null || String.IsNullOrEmpty(cookie.Value)) 
     { 
      throw CreateValidationException(); 
     } 

     AntiForgeryData cookieToken = antiForgeryDataSerializer.Deserialize(cookie.Value); 
     //Rest of the code here// 
     } 

Dans "filterContext", le nom du cookie est "_RequestVerificationToken" puis-je ajouter le nom du chemin. Le nom du chemin est codé en Base64 et ajouté à AntiForgeryFieldName, ce qui devient "_RequestVerificationToken_Lw__". Lorsque nous vérifions si le cookie existe, alors évidemment nous ne pouvons pas le trouver et nous obtenons l'exception AntiForgery. Mais dans l'ancienne version de ce code, la valeur de Cookie dans "filterContext" vient comme "_RequestVerificationToken_Lw__" et par conséquent, fonctionne très bien. Alors, où est le problème ici? Est-ce quelque chose lié à Machine Keys ou autre chose?

Merci d'avance.

+2

Je ne suis pas entièrement sûr de comprendre ce que vous faites ici. L'anti-contrefaçon est intégrée à MVC. Vous n'avez pas besoin de votre propre attribut; utilisez simplement l'attribut 'ValidationAntiForgeryToken' intégré dans votre action de contrôleur et' @ Html.AntiForgeryToken() 'dans votre vue. –

Répondre

0

@ Html.AntiForgeryToken() invocation dans la vue génère un nouveau jeton et écrit sous la forme comme ceci:

<form action="..." method="post">   
    <input name="__RequestVerificationToken" type="hidden"   
     value="J56khgCvbE3bVcsCSZkNVuH9Cclm9SSIT/ywruFsXEgmV8CL2eW5C/gGsQUf/YuP" /> 
     <!-- Other fields. -->  
</form> 

et écrit aussi dans le cookie:

__RequestVerificationToken_Lw__= 
    J56khgCvbE3bVcsCSZkNVuH9Cclm9SSIT/ywruFsXEgmV8CL2eW5C/gGsQUf/YuP 

Lorsque la formulaire ci-dessus est soumis, ils sont tous deux envoyés au serveur.

Du côté du serveur, [ValidateAntiForgeryToken] attribut est utilisé pour spécifier les contrôleurs ou les actions pour les valider:

[HttpPost] 
[ValidateAntiForgeryToken()] 
public ActionResult Action(/* ... */) 
{ 
    // ... 
} 

Tout ce que vous devez faire est d'invoquer la AntiForgeryToken dans la vue et spécifier « ValidateAntiForgeryToken » attribut sur l'action du contrôleur.

+0

Merci pour la réponse. Oui, nous avons le @ html.AntiForgeryToken() dans View et nous avons utilisé l'attribut [ValidateAntiForgeryToken] dans le contrôleur et c'est ainsi que cela se produit dans la méthode "OnAuthorization" que j'ai fournie dans la question. Le gros problème auquel nous avons été confrontés est que le cookie "_RequestVerification_Lw__" ne génère pas pour nous dans MVC 4.0. HttpContext.Request.Cookies n'a que "_RequestVerificationToken" comme nom de cookie et une valeur codée correspondante dans celui-ci. Toute aide est appréciée. –

+0

Lorsque je vois la source, seul "__RequestVerificationToken" est généré. Vous pouvez essayer d'ajouter cette ligne de code pour valider uniquement avec "__RequestVerificationToken" au lieu de lancer "CreateValidationException" si le cookie est introuvable. Laissez-moi savoir si cela fonctionne! AntiForgery.Validate (cookie! = Null? Cookie.Value: null, httpContext.Request.Headers ["__ RequestVerificationToken"]); – SailajaPalakodeti

+0

Cette modification renvoie l'erreur suivante: Erreur de serveur dans l'application '/'. Le cookie anti-falsification requis "__RequestVerificationToken" n'est pas présent. Description: Une exception non gérée s'est produite lors de l'exécution de la demande Web en cours. Veuillez consulter la trace de la pile pour plus d'informations sur l'erreur et son origine dans le code. Détails de l'exception: System.Web.Mvc.HttpAntiForgeryException: le cookie anti-falsification requis "__RequestVerificationToken" n'est pas présent. –