我经常对可见状态MAC失败的问题进行验证。我在Web场中运行我的应用程序,并在所有Web服务器上将应用程序的机器密钥设置为相同的值。
我一直在做一些实验,现在我有两个关于防伪标记机制的问题:
1.即使我没有使用[ValidateAntiForgeryToken]属性调用任何操作,我似乎也会收到此错误(在视图中呈现令牌时似乎出现问题)。为什么会这样?是否应该仅在属性存在时才运行验证。如果删除了__RequestVerificationToken cookie,则问题会消失。
2. __RequestVerificationToken cookie不应该是会话cookie,因此会话到期时无效吗?情况似乎并非如此?
堆栈追踪:
未提供所需的防伪标记或无效
at System.Web.Mvc.AntiForgeryDataSerializer.Deserialize(String serializedToken)
在 System.Web.Mvc.HtmlHelper.GetAntiForgeryTokenAndSetCookie(String salt, 字符串域,字符串路径)
在 System.Web.Mvc.HtmlHelper.AntiForgeryToken(String salt,String domain, 字符串路径)
在System.Web.Mvc.HtmlHelper.AntiForgeryToken()
在 ASP.views_customer__customerlogin_ascx .__ Render__control1(HtmlTextWriter的 __w,Control parameterContainer)
在System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection孩子们)在 System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection孩子们)在 System.Web.UI.Page.Render(HtmlTextWriter writer)
在 System.Web.Mvc.ViewPage.Render(HtmlTextWriter writer)
在 System.Web.UI.Page.ProcessRequestMain(布尔 includeStagesBeforeAsyncPoint,Boolean includeStagesAfterAsyncPoint)
在System.Web.UI.Page.ProcessRequest(布尔值 includeStagesBeforeAsyncPoint,Boolean includeStagesAfterAsyncPoint)
在System.Web.UI.Page.ProcessRequest()处 System.Web.UI.Page.ProcessRequest(HttpContext context)
在 System.Web.Mvc.ViewUserControl.ViewUserControlContainerPage.ProcessRequest(HttpContext的 上下文)在System.Web.Mvc.ViewPage.RenderView(ViewContext viewContext)
在 System.Web.Mvc.ViewUserControl.RenderViewAndRestoreContentType(的ViewPage containerPage,ViewContext viewContext)
在 System.Web.Mvc.HtmlHelper.RenderPartialInternal(字符串 partialViewName,ViewDataDictionary viewData,Object model,TextWriter writer,ViewEngineCollection viewEngineCollection)
在 System.Web.Mvc.Html.RenderPartialExtensions.RenderPartial(的HtmlHelper htmlHelper,String partialViewName,Object model)at ASP.views_cart_index_aspx .__ Rendercontainer_main(HtmlTextWriter __w, 控制参数容器)
在 System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection孩子们) ASP.views_shared_site_master .__ Render__control1(HtmlTextWriter __w, 控制参数容器) System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection孩子们)在 System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children)在System.Web.UI.Page.Render(HtmlTextWriter 编写者)
在System.Web.Mvc.ViewPage.Render(HtmlTextWriter writer) 在System.Web.UI.Page.ProcessRequestMain(布尔值 includeStagesBeforeAsyncPoint,Boolean includeStagesAfterAsyncPoint) 在System.Web.UI.Page.ProcessRequest(布尔值 includeStagesBeforeAsyncPoint,Boolean includeStagesAfterAsyncPoint) 在System.Web.UI.Page.ProcessRequest()处 System.Web.UI.Page.ProcessRequest(HttpContext context)
在 System.Web.Mvc.ViewPage.ProcessRequest(HttpContext context)at ASP.views_cart_index_aspx.ProcessRequest(HttpContext context)
在 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 handler, TextWriter writer,Boolean preserveForm,Boolean setPreviousPage, VirtualPath路径,VirtualPath filePath,String physPath,Exception error,String queryStringOverride)
内部异常
viewstate MAC验证失败。如果此应用程序由a托管 Web场或群集,确保配置指定 相同的validationKey和验证算法。 AutoGenerate不能 在集群中使用。
答案 0 :(得分:2)
[ValidateAntiForgeryToken]
属性修饰的操作才会验证令牌,并可能引发此异常。__RequestVerificationToken
cookie与任何会话无关,永远不会超时。验证包括检查cookie值与隐藏字段中的POSTed值的相等性。