2010-11-15 3 views
1

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

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

2. Не является ли файл cookie __RequestVerificationToken сессионным файлом cookie и, следовательно, недействителен по истечении срока действия сеанса? Кажется, это не так?Подтверждающий токен MVC Anti, несмотря на то, что нет [ValidateAntiForgeryToken]

Стек след:

Необходимым против подделки маркер не был передан или был недействителен

на System.Web.Mvc.AntiForgeryDataSerializer.Deserialize (Строка serializedToken)
в системе. Web.Mvc.HtmlHelper.GetAntiForgeryTokenAndSetCookie (String salt, String domain, String path)
at System.Web.Mvc.HtmlHelper.AntiForgeryToken (String salt, String domain, String path)
в System.Web. Mvc.HtmlHelper.AntiForgeryToken()
в ASP.views_customer__customerlogin_ascx._ Рендер _control1 (HtmlTextWriter __w, управление parameterContainer)
на System.Web.UI.Control.RenderChildrenInternal (HtmlTextWriter писатель, ICollection детей)
в системе. Web.UI.Control.RenderChildrenInternal (HtmlTextWriter писатель, ICollection детей)
на System.Web.UI.Page.Render (HtmlTextWriter писатель)
в System.Web.Mvc.ViewPage.Render (HtmlTextWriter писатель)
в системе .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 контекст)
в системе .Web.Mvc.ViewUserControl.ViewUserControlContainerPage.ProcessRequest (HttpContext контекст)
в System.Web.Mvc.ViewPage.RenderView (ViewContext ViewContext)
на System.Web.Mvc.ViewUserControl.RenderViewAndRestoreContentType (ViewPage containerPage, ViewContext ViewContext)
at System.Web.Mvc.HtmlHelper.RenderPartialInternal (String partialViewName, ViewDataDictionary viewData, Object model, TextWriter writer, ViewEngineCollection viewEngineCollection)
на System.Web.Mvc.Html.RenderPartialExtensions.RenderPartial (HtmlHelper HtmlHelper, струнного partialViewName, модель объекта) в ASP.views_cart_index_aspx .__ Rendercontainer_main (HtmlTextWriter __w, управление parameterContainer)
в System.Web.UI.Control.RenderChildrenInternal (HtmlTextWriter писатель, ICollection детей) в ASP.views_shared_site_master._ Рендер _control1 (HtmlTextWriter __w, контроль parameterContainer) в System.Web.UI.Control.RenderChildrenInternal (HtmlTextWriter писатель, ICollection детей)
на System.Web.UI.Control. RenderChildrenInternal (HtmlTextWriter writer, ICollection children) в System.Web.UI.Page. Render (HtmlTextWriter writer)
в System.Web.Mvc.ViewPage.Render (HtmlTextWriter writer) в 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.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()
в System.Web.Mvc.HttpHandlerUtil.ServerExecuteHttpHandlerWrapper.Wrap [TResult] (Func`1 Func)
в System.Web.Mvc.HttpHandlerUtil.ServerExecuteHttpHandlerWrapper.Wrap (действий действие)
в System.Web.HttpServerUtility.ExecuteInternal (обработчик IHttpHandler, TextWriter писатель, булевой preserveForm, булевой setPreviousPage, виртуальный_путь путь, виртуальный_путь Filepath, Струнный physPath, ошибка Exception, String queryStringOverride)

Inner исключением

Val Идентификация MAC-адреса viewstate не удалась. Если это приложение размещено веб-фермой или кластером, убедитесь, что в конфигурации указан тот же алгоритм validationKey и validation. AutoGenerate не может использоваться в кластере.

ответ

1
  1. Только действия, декорированные атрибутом [ValidateAntiForgeryToken], подтверждают токен и могут вызвать это исключение.
  2. __RequestVerificationToken cookie не имеет никакого отношения к какой-либо сессии и никогда не истекает. Проверка состоит в проверке равенства значения cookie с POSTED значением из скрытого поля.
+0

Если вы посмотрите на трассировку стека, я обновил вопрос, это, похоже, не совсем верно. – Markus

+0

Да, действительно, помощник HTML AntiForgeryToken HTML проверяет наличие файла cookie и пытается десериализовать его значение. Здесь происходит исключение. Кажется, что файл cookie был зашифрован машинным ключом, который отличается от машинного ключа, используемого для его расшифровки. –

+0

Привет, Спасибо за объяснение. Я все еще смущен тем, почему кто-то захочет проверить cookie при рендеринге. – Markus

Смежные вопросы