Какая ошибка может привести к ошибке: Требуемый токен против подделки не был предоставлен или был недействительным - PullRequest
0 голосов
/ 26 января 2012

Мой вопрос очень похож на этот вопрос: Исключение защиты от подделки: требуемый токен подделки не был предоставлен или был недействительным , но у меня установлен MVC3 и я использую Razor.

Контроллер имеет

[ValidateAntiForgeryToken]

, указанный

в html, напечатан <input name="__RequestVerificationToken"... с использованием @Html.AntiForgeryToken()

Также я заметил, что , если я удаляю куки авторизации в браузере, а метод контроллера не имеет [Authorize] У меня нет проблем с AntiForery .Почему?

Ответы [ 2 ]

0 голосов
/ 09 октября 2013

Токен защиты от подделки привязан к личности пользователя. Если вы изменяете имя пользователя, вошедшего в систему, между созданием и проверкой токенов, токен не будет успешно проверен. Кроме того, это объясняет, почему у вас все работает в анонимном режиме.

0 голосов
/ 07 мая 2012

Проверьте файлы cookie и убедитесь, что файл cookie requestVerificationToken установлен правильно.Я сталкивался с этим раньше, когда все файлы cookie для сайта были настроены только на SSL, и я пытался запустить его через обычный HTTP локально, поэтому файл cookie никогда не принимался, поскольку передавался по незащищенным каналам.

Для меня это означало изменение строки в файле web.config в system.web / httpCookies на requireSSL = "false" ... но если это не то, что вы видите, я все равно посмотрю на вещи, которые могутсвязываться с вашими файлами cookie в системе (например, сброс сеанса, удаление файлов cookie вручную и т. д.).Если у вас есть атрибут проверки правильности в методах контроллера и вы все еще получаете его, это, вероятно, связано с тем, что что-то изменило или удалило этот файл cookie!

Редактировать: Кроме того, если у вас есть этона контроллере, а не только на методах POST, вот почему ... Это применимо только для формирования POST на сервере.

Вот простая пользовательская версия, которую вы МОЖЕТЕ применить к форме, которая будет автоматическипроверять на ВСЕХ методах действия POST:

/// <summary>
/// Custom Implementation of the Validate Anti Forgery Token Attribute.
/// </summary>
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public class CustomValidateAntiForgeryTokenAttribute : FilterAttribute, IAuthorizationFilter
{
    /// <summary>
    /// The ValidateAntiForgeryTokenAttribute.
    /// </summary>
    private readonly ValidateAntiForgeryTokenAttribute _validator;

    /// <summary>
    /// The AcceptVerbsAttribute.
    /// </summary>
    private readonly AcceptVerbsAttribute _verbs;

    /// <summary>
    /// Initializes a new instance of the <see cref="CustomValidateAntiForgeryTokenAttribute"/> class.
    /// </summary>
    /// <param name="verbs">The verbs.</param>
    public CustomValidateAntiForgeryTokenAttribute(HttpVerbs verbs) : this(verbs, null)
    {
    }

    /// <summary>
    /// Initializes a new instance of the <see cref="CustomValidateAntiForgeryTokenAttribute"/> class.
    /// </summary>
    /// <param name="verbs">The verbs.</param>
    /// <param name="salt">The salt.</param>
    public CustomValidateAntiForgeryTokenAttribute(HttpVerbs verbs, string salt)
    {
        _verbs = new AcceptVerbsAttribute(verbs);
        _validator = new ValidateAntiForgeryTokenAttribute
                         {
                             Salt = salt
                         };
    }

    /// <summary>
    /// Called when authorization is required.
    /// </summary>
    /// <param name="filterContext">The filter context.</param>
    public void OnAuthorization(AuthorizationContext filterContext)
    {
        var httpMethodOverride = filterContext.HttpContext.Request.GetHttpMethodOverride();

        var found = false;
        foreach (var verb in _verbs.Verbs)
        {
            if (verb.Equals(httpMethodOverride, StringComparison.OrdinalIgnoreCase))
            {
                found = true;
            }
        }

        if (found && !filterContext.RequestContext.RouteData.Values["action"].ToString().StartsWith("Json"))
        {
            _validator.OnAuthorization(filterContext);
        }
    }
}

Затем вы можете просто добавить следующее ко всем вашим контроллерам или к базовому контроллеру, если вы переопределяете и наследуете от одного:

    [CustomValidateAntiForgeryToken(HttpVerbs.Post)]
...