即使没有[ValidateAntiForgeryToken],MVC Anti伪造令牌也会被验证

时间:2010-11-15 07:27:26

标签: asp.net asp.net-mvc-2 cookies

我经常对可见状态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不能   在集群中使用。

1 个答案:

答案 0 :(得分:2)

  1. 只有使用[ValidateAntiForgeryToken]属性修饰的操作才会验证令牌,并可能引发此异常。
  2. __RequestVerificationToken cookie与任何会话无关,永远不会超时。验证包括检查cookie值与隐藏字段中的POSTed值的相等性。