【问题标题】:ValidateAntiForgeryToken and Authorize timeoutValidateAntiForgeryToken 和 Authorize 超时
【发布时间】:2012-01-17 02:11:54
【问题描述】:

我有一个用 ValidateAntiForgeryToken 和 Authorize 装饰的 ActionResult。一旦达到我的表单授权超时限制,我就会收到“所需的防伪令牌未提供或无效”错误,而不是被路由到我的登录页面。

谁能解释为什么会这样?

【问题讨论】:

    标签: asp.net-mvc-3


    【解决方案1】:

    ValidateAntiForgeryTokenAttribute

    '表示一个属性,用于检测服务器是否 请求已被篡改。'

    引用MSDNHtml.AntiForgeryToken() 所做的是将隐藏字段输出到表单中,例如:<input name="__RequestVerificationToken" type="hidden" value="XXX" />

    ValidateAntiForgeryTokenAttribute 在回发时所做的是将发布的值与之前存储的 cookie 进行比较,以验证它们是否匹配。有关详细信息,请参阅http://aspnet.codeplex.com/SourceControl/changeset/view/72551#338576OnAuthorization 方法)。 cookie 的名称为 RequestVerificationToken_Lw(您可以使用像 FireCookie 这样的 cookie 检查工具来查看)。

    存储的 cookie 是一个会话 cookie(重要的一点)。这意味着当您的授权超时(在 .NET 中默认为 30 分钟)时,cookie 过期,不会随下一个请求一起发送,并且与隐藏字段值的比较失败,抛出 HttpAntiForgeryException

    【讨论】:

    • 感谢您的回复...我不太确定如何解决此问题。基本上,我希望 属性在 之前执行并将用户路由到我的登录页面。知道如何做到这一点吗?
    • 动作过滤器属性按照它们添加的顺序执行,所以如果你在 ValidateAntiForgeryToken 之前添加 Authorize 那么它将起作用。或者,您可以使用 Order 属性来更改排序。
    【解决方案2】:

    确保在视图的 BeginForm(){....} 中使用 @Html.AntiForgeryToken()

     @using(Html.BeginForm()){
           @Html.AntiForgeryToken()
         .
         .
         .
         .
        }
    

    然后这将在动作过滤器属性[ValidateAntiForgeryToken]中进行验证

    【讨论】:

    • 我已经在这样做了。我的防伪逻辑按预期工作,除非超出 超时限制。然后我收到“未提供所需的防伪令牌或无效”错误。
    猜你喜欢
    • 1970-01-01
    • 2012-07-13
    • 1970-01-01
    • 2011-12-30
    • 2020-08-18
    • 2015-11-24
    • 1970-01-01
    • 1970-01-01
    • 2014-04-24
    相关资源
    最近更新 更多