我正在构建单页面应用程序并遇到防伪令牌问题.
我知道为什么问题发生我只是不知道如何解决它.
发生以下情况时,我收到错误消息:
防伪令牌适用于用户"",但当前用户是"用户名"
发生这种情况的原因是因为我的应用程序是100%单页,并且当用户通过ajax帖子成功登录时/Account/JsonLogin,我只是使用从服务器返回的"已验证视图"切换出当前视图但不重新加载页.
我知道这就是原因,因为如果我在步骤3和4之间简单地重新加载页面,就没有错误.
所以似乎@Html.AntiForgeryToken()在加载的表单中仍然为旧用户返回一个令牌,直到重新加载页面.
如何更改@Html.AntiForgeryToken()为新的经过身份验证的用户返回令牌?
我注入了新的GenericalPrincipal带有自定义IIdentity每个Application_AuthenticateRequest这样的时候@Html.AntiForgeryToken()被调用HttpContext.Current.User.Identity,其实我与自定义标识IsAuthenticated属性设置为true,但@Html.AntiForgeryToken似乎仍然呈现为老用户令牌,除非我做一个页面重新加载.
这是场景:
我有一个登录页面,当用户签名时,它会被重定向到主页应用程序页面.然后用户使用浏览器后退按钮,现在他在登录页面上.他尝试再次登录,但现在抛出异常:
HttpAntiForgeryException(0x80004005):提供的防伪令牌适用于用户"",但当前用户是"userName".
我知道这与缓存有关.我使用自定义NoCache过滤器禁用了浏览器缓存以进行登录操作,该过滤器设置了所有必需的标头 - 无缓存,无存储,必须重新验证等.但是
我将尝试制作黑客并强制Safari移动刷新,但这不是我所期待的.
我想知道我是否可以:
更新1
为了澄清一下,我知道如何处理MVC中的错误.问题是这个处理错误根本解决了我的问题.错误处理的基本思想是重定向到自定义错误页面,并带有好消息.但我希望防止发生此错误,而不是以用户可见的方式处理它.通过句柄我的意思是捕获用户名替换或其他合适的操作然后继续登录.
更新2
我添加了下面的解决方案,这对我有用.
我有一个网站收到大量以下错误:
提供的防伪令牌适用于与当前用户不同的基于声明的用户.
防伪cookie令牌和表单字段令牌不匹配.
如果防伪令牌不是针对用户但在登录页面上包含用户,我想阻止该站点抛出错误,例如:
提供的防伪令牌适用于用户"",但当前用户是"Garret".
我不希望此例外适用于登录页面以外的任何其他页面.所以我不想添加AntiForgeryConfig.SuppressIdentityHeuristicChecks = true;到整个网站.我还想让网站尽可能安全,因为它包含HIPAA数据.我该怎么做才能保证它尽可能安全,但仍然试图在登录页面上防止这个错误,因为它使用户难以使用?
该站点托管在负载平衡服务器上,但我认为这不是问题.我认为错误主要是由于使用浏览器的后退按钮,在登录前打开登录页面一段时间,已登录或多次登录.还有一些用户通过可能没有加载页面的应用程序访问它,只是尝试发布登录信息.
所以,请让我知道在尽可能安全的同时防止登录页面出现此错误的最佳选择是什么?