【问题标题】:Asp.Net Anti-ForgeryAsp.Net 防伪
【发布时间】:2012-06-29 19:19:27
【问题描述】:

我有一个问题,我最近在我的所有表单中都放入了防伪令牌,并在我的控制器中放入了ValidateAntiForgeryToken 属性。

但我的用户经常填写表格,然后用浏览器按钮返回,纠正其中一个错误,然后他们得到无效的防伪令牌。

我可以理解为什么会发生这种情况(我们将返回并使用不再有效的防伪令牌),但是有什么方法可以避免这种行为吗?想强制重新加载此页面?

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-3 csrf antiforgerytoken


    【解决方案1】:

    这很奇怪。防伪令牌不是一次性使用令牌。它们通常可以在同一个会话中愉快地重用。您的用户当时是否已登录?令牌基于登录,因此如果他们在此期间重新登录,则令牌可能不再有效。

    【讨论】:

    • 嗯,是的,但我有一个自定义用户名提供程序。它依靠什么来检测它是另一个用户?
    • 查看用户名代码:stackoverflow.com/questions/5767768/…
    • 对不起,我没看懂,这个验证方法是什么?不是我可以访问 asp.net 验证令牌的方式
    • 不,但如果你正在做一些定制的事情导致它失败,那么你将不得不调试它。您在上面提到的重复帖子的场景默认情况下使用防伪令牌可以正常工作,因此某些事情失败的事实意味着您必须对其进行一些调试。如果您可以重复此操作并缩小测试用例的范围,您可以轻松获取 mvc 源代码并进入其中。如果用户名在请求之间发生变化,这将导致失败。
    【解决方案2】:

    使用 TempData 方法的“redirect-after-post 模式”应该可以解决您的问题。

    基本的想法是你可以在你的 Action 中为 TempData 添加一些值,并检查该值是否存在。如果用户按下“后退按钮”或刷新页面,TempData 值将不再存在 - 您可以检查此值并做出适当反应(即,如果您愿意,请重新提交操作)。

    我可以更详细地介绍,但 Darin Dimitrov 的 this post 总结得恰到好处

    【讨论】:

    • 我希望我能做到这一点,但不幸的是,我有非常严格的页面,我必须在修改后重定向。
    猜你喜欢
    • 2017-12-28
    • 2018-12-17
    • 1970-01-01
    • 1970-01-01
    • 2022-08-16
    • 2014-04-26
    • 2010-11-17
    • 1970-01-01
    • 2018-01-02
    相关资源
    最近更新 更多