【发布时间】:2015-12-15 15:55:58
【问题描述】:
我想通过 AntiforgeryToken 属性保护我们的登录操作 - 我知道为什么会出现该主题的异常,但我似乎找不到任何好的解决方案。
假设我们有以下情况:
现在是上午 8:00,应用程序用户开始工作,他们坐下来开始登录过程 - 现在很可能某些用户会得到相同的结果验证令牌。在第一个登录后 - 所有其他人在尝试登录时都会看到上述异常(或其他一些自定义异常屏幕)。
某些用户登录,然后不小心按下了“返回”按钮并尝试再次登录 - 虽然这种情况不太可能发生,但它可能会发生,我不希望用户查看异常情况。
所以问题很简单 - 如何防止上述情况,或者如何处理它们以便用户不会注意到任何事情。我尝试了以下方法:
- 在 Application_Start in Global.asax 中设置 AntiForgeryConfig.SuppressIdentityHeuristicChecks = true; - 它没有解决问题,我仍然得到同样的例外
- 在具有 [ValidateAntiForgeryToken] 属性的方法上设置 [OutputCache(NoStore = true, Duration = 0, VaryByParam = "None")] - 再次,没有运气
现在我正在考虑手动验证动作正文中的令牌,捕获错误,并检查匿名用户是否进行了尝试:
public ActionResult SomeAction()
{
try
{
AntiForgery.Validate();
}
catch(HttpAntiForgeryException ex)
{
if(String.IsNullOrEmpty(HttpContext.User.Identity.Name))
{
throw;
}
}
//Rest of action body here
//..
//..
}
以上似乎可以防止错误 - 但它安全吗? 有哪些替代方法?
提前致谢。
最好的问候。
编辑:
最终的“解决方案”是禁用登录表单上的令牌验证 - 可能有更好的方法来处理它,但我发现的所有解决方案似乎都是类似于我上面提出的丑陋的解决方法。
由于无法知道这些替代方案有多“安全”(如果它们完全安全的话),我们决定在登录时禁用令牌验证。
【问题讨论】:
-
可以使用脚本禁用双重提交,stackoverflow.com/questions/2830542/…
-
嗨,当用户点击浏览器上的返回按钮时,我遇到了同样的问题。你的结局是什么?
-
@VAAA:请参阅我的问题的编辑部分 - 因为只有登录表单给了我们这个问题,所以最后我们只是在那里禁用了令牌验证。我们认为这根本不值得麻烦,坦率地说,我找不到任何“干净”的解决方案——只有一些丑陋的解决方法(比如我用 try-catch 发布的那个)。
标签: exception-handling asp.net-mvc-5 antiforgerytoken