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.
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. –