AntiForgeryToken без проверки подлинности форм - PullRequest
5 голосов
/ 10 ноября 2011

У нас есть веб-сайт, который использует MVC3 и пользовательский метод проверки подлинности, который вообще не полагается на проверку подлинности с помощью форм - по крайней мере из того, что я могу сказать. В web.config мы устанавливаем

<authentication mode="None"></authentication>

и мы никогда не используем / не устанавливаем HttpContext.User где-либо в коде. Проблема в том, что при использовании @ Html.AntiForgeryToken () в некоторых случаях пользователь получает следующее сообщение об ошибке:

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

Мы централизуем все проверки на подделку в OnAuthorization с помощью этого кода:

if (String.Compare(filterContext.HttpContext.Request.HttpMethod, "post", true) == 0)
{
  var forgery = new ValidateAntiForgeryTokenAttribute();
  forgery.OnAuthorization(filterContext);
}

Вот где происходит исключение. Мы определили machineKey в web.config , чтобы предотвратить генерацию новых ключей при перезагрузке пула приложений. Это не решило проблему.

Затем мы подумали, что, возможно, браузер клиента не отправляет куки. Мы начали регистрировать cookie-файлы и заметили, что в некоторых случаях cookie-файл RequestVerificationToken_Lw отправляется, а в других - нет, хотя другие cookie-файлы, например, созданные Google Analytics, отправляются очень хорошо. Может быть, что-то в браузере удаляет некоторые куки и оставляет другие в?

Похоже, что токен защиты от подделки зависит от аутентификации форм . Это тот случай? Любой способ продолжать использовать AntiForgeryToken, когда не используется надежная проверка подлинности с помощью форм. Помните, что метод, который я описал выше, работает более чем в 90% случаев, но мы не можем точно определить, почему он не работает для некоторых людей.

Мысли
Спасибо!

Ответы [ 2 ]

0 голосов
/ 18 ноября 2011

Добавляете ли вы маркер защиты от подделки внутри формы? Маркер защиты от подделки хранится на клиенте через скрытый HTML-элемент, а не в виде файла cookie. Другой вопрос: какую версию браузера они используют? Можно ли обновить до последней версии?

   @using (Html.BeginForm())
   {
      @Html.AntiForgeryToken()...
0 голосов
/ 18 ноября 2011

Есть ли у некоторых пользователей эта проблема все время? Или просто время от времени? Кроме того, он работает для некоторых методов ВСЕ время или несовместим для одного и того же метода действия? Есть ли у вас какие-либо Ajax звонки? Реализация токена защиты от подделки по умолчанию не обрабатывает вызовы AJAX. Но вы можете написать собственный код, чтобы заставить его работать

...