【发布时间】:2012-01-17 02:11:54
【问题描述】:
我有一个用 ValidateAntiForgeryToken 和 Authorize 装饰的 ActionResult。一旦达到我的表单授权超时限制,我就会收到“所需的防伪令牌未提供或无效”错误,而不是被路由到我的登录页面。
谁能解释为什么会这样?
【问题讨论】:
标签: asp.net-mvc-3
我有一个用 ValidateAntiForgeryToken 和 Authorize 装饰的 ActionResult。一旦达到我的表单授权超时限制,我就会收到“所需的防伪令牌未提供或无效”错误,而不是被路由到我的登录页面。
谁能解释为什么会这样?
【问题讨论】:
标签: asp.net-mvc-3
ValidateAntiForgeryTokenAttribute
'表示一个属性,用于检测服务器是否 请求已被篡改。'
引用MSDN。 Html.AntiForgeryToken() 所做的是将隐藏字段输出到表单中,例如:<input name="__RequestVerificationToken" type="hidden" value="XXX" />。
ValidateAntiForgeryTokenAttribute 在回发时所做的是将发布的值与之前存储的 cookie 进行比较,以验证它们是否匹配。有关详细信息,请参阅http://aspnet.codeplex.com/SourceControl/changeset/view/72551#338576(OnAuthorization 方法)。 cookie 的名称为 RequestVerificationToken_Lw(您可以使用像 FireCookie 这样的 cookie 检查工具来查看)。
存储的 cookie 是一个会话 cookie(重要的一点)。这意味着当您的授权超时(在 .NET 中默认为 30 分钟)时,cookie 过期,不会随下一个请求一起发送,并且与隐藏字段值的比较失败,抛出 HttpAntiForgeryException。
【讨论】:
确保在视图的 BeginForm(){....} 中使用 @Html.AntiForgeryToken()
@using(Html.BeginForm()){
@Html.AntiForgeryToken()
.
.
.
.
}
然后这将在动作过滤器属性[ValidateAntiForgeryToken]中进行验证
【讨论】: