Проверка токена подделки MVC Anti, хотя нет [ValidateAntiForgeryToken] - PullRequest
1 голос
/ 15 ноября 2010

Время от времени у меня была страшная проблема с проверкой MAC-адреса viewstate. Я запускаю свое приложение в веб-ферме и на всех веб-серверах устанавливаю одинаковое значение ключа компьютера приложения. Я провел несколько экспериментов, и теперь у меня есть два вопроса относительно механизма защиты от подделки токенов:

1. Кажется, я получаю эту ошибку, хотя я не вызываю никаких действий с атрибутом [ValidateAntiForgeryToken] (проблема, кажется, возникает при рендеринге токена в представлении). Почему это происходит? Разве проверка не должна выполняться только при наличии атрибута. Проблема исчезнет, ​​если файл cookie __RequestVerificationToken будет удален.

2. Разве файл cookie __RequestVerificationToken не должен быть файлом cookie сеанса и, следовательно, быть недействительным по окончании сеанса? Кажется, это не так?

Трассировка стека:

Требуемый токен защиты от подделки не был предоставлен или был недействительным

в System.Web.Mvc.AntiForgeryDataSerializer.Deserialize (String serializedToken)
в System.Web.Mvc.HtmlHelper.GetAntiForgeryTokenAndSetCookie (String salt, Строковый домен, строковый путь)
at System.Web.Mvc.HtmlHelper.AntiForgeryToken (Строковая соль, Строковый домен, Путь к строке)
на System.Web.Mvc.HtmlHelper.AntiForgeryToken ()
в ASP.views_customer__customerlogin_ascx .__ Render__control1 (HtmlTextWriter __w, управляющий параметрContainer)
в System.Web.UI.Control.RenderChildrenInternal (модуль записи HtmlTextWriter, Сбор детей)
на System.Web.UI.Control.RenderChildrenInternal (писатель HtmlTextWriter, Сбор детей)
на System.Web.UI.Page.Render (писатель HtmlTextWriter)
в System.Web.Mvc.ViewPage.Render (писатель HtmlTextWriter)
в System.Web.UI.Page.ProcessRequestMain (Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
на System.Web.UI.Page.ProcessRequest (Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
в System.Web.UI.Page.ProcessRequest () в System.Web.UI.Page.ProcessRequest (контекст HttpContext)
в System.Web.Mvc.ViewUserControl.ViewUserControlContainerPage.ProcessRequest (HttpContext контекст)
на System.Web.Mvc.ViewPage.RenderView (ViewContext viewContext)
at System.Web.Mvc.ViewUserControl.RenderViewAndRestoreContentType (ViewPage containerPage, ViewContext viewContext)
в System.Web.Mvc.HtmlHelper.RenderPartialInternal (String partalViewName, ViewDataDictionary viewData, Объектная модель, TextWriter писатель, ViewEngineCollection viewEngineCollection)
в System.Web.Mvc.Html.RenderPartialExtensions.RenderPartial (HtmlHelper htmlHelper, StringpartalViewName, Объектная модель) в ASP.views_cart_index_aspx .__ Rendercontainer_main (HtmlTextWriter __w, Управляющий параметрContainer)
at System.Web.UI.Control.RenderChildrenInternal (писатель HtmlTextWriter, Сбор детей) на ASP.views_shared_site_master .__ Render__control1 (HtmlTextWriter __w, Управляющий параметрContainer) в System.Web.UI.Control.RenderChildrenInternal (писатель HtmlTextWriter, Сбор детей)
на System.Web.UI.Control.RenderChildrenInternal (писатель HtmlTextWriter, ICollection children) в System.Web.UI.Page.Render (HtmlTextWriter писатель)
на System.Web.Mvc.ViewPage.Render (писатель HtmlTextWriter) at System.Web.UI.Page.ProcessRequestMain (Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) at System.Web.UI.Page.ProcessRequest (Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) в System.Web.UI.Page.ProcessRequest () в System.Web.UI.Page.ProcessRequest (контекст HttpContext)
в System.Web.Mvc.ViewPage.ProcessRequest (контекст HttpContext) по адресу ASP.views_cart_index_aspx.ProcessRequest (контекст HttpContext)
в System.Web.Mvc.HttpHandlerUtil.ServerExecuteHttpHandlerWrapper. <> C__DisplayClass1.b__0 () вSystem.Web.Mvc.HttpHandlerUtil.ServerExecuteHttpHandlerWrapper. <> C__DisplayClass4.b__3 ()at System.Web.Mvc.HttpHandlerUtil.ServerExecuteHttpHandlerWrapper.Wrap [TResult] (Func`1 func)в System.Web.Mvc.HttpHandlerUtil.ServerExecuteHttpHandlerWrapper.Wrap (действие действия)в System.Web.HttpServerUtility.ExecuteInternal (обработчик IHttpHandler, модуль записи TextWriter, логический preserveForm, логический setPreviousPage, путь VirtualPath, файл VirtualPathPath, физическая строка String, ошибка исключения, ошибка String queryStringOverride)

Внутреннее исключение

Не удалось проверить MAC представления состояния.Если это приложение размещено на веб-ферме или в кластере, убедитесь, что в конфигурации указан одинаковый ключ validationKey и алгоритм проверки.Автогенерация не может использоваться в кластере.

1 Ответ

2 голосов
/ 15 ноября 2010
  1. Только действия, отмеченные атрибутом [ValidateAntiForgeryToken], проверяют токен и могут вызвать это исключение.
  2. __RequestVerificationToken cookie не имеет отношения к какой-либо сессии и никогда не заканчивается. Проверка состоит в проверке равенства значения cookie со значением POSTed из скрытого поля.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...