相关疑难解决方法(0)

防伪令牌适用于用户"",但当前用户是"用户名"

我正在构建单页面应用程序并遇到防伪令牌问题.

我知道为什么问题发生我只是不知道如何解决它.

发生以下情况时,我收到错误消息:

  1. 未登录用户加载对话框(带有生成的防伪标记)
  2. 用户关闭对话框
  3. 用户登录
  4. 用户打开相同的对话框
  5. 用户在对话框中提交表单

防伪令牌适用于用户"",但当前用户是"用户名"

发生这种情况的原因是因为我的应用程序是100%单页,并且当用户通过ajax帖子成功登录时/Account/JsonLogin,我只是使用从服务器返回的"已验证视图"切换出当前视图但不重新加载页.

我知道这就是原因,因为如果我在步骤3和4之间简单地重新加载页面,就没有错误.

所以似乎@Html.AntiForgeryToken()在加载的表单中仍然为旧用户返回一个令牌,直到重新加载页面.

如何更改@Html.AntiForgeryToken()为新的经过身份验证的用户返回令牌?

我注入了新的GenericalPrincipal带有自定义IIdentity每个Application_AuthenticateRequest这样的时候@Html.AntiForgeryToken()被调用HttpContext.Current.User.Identity,其实我与自定义标识IsAuthenticated属性设置为true,但@Html.AntiForgeryToken似乎仍然呈现为老用户令牌,除非我做一个页面重新加载.

membership-provider asp.net-mvc-4

122
推荐指数
5
解决办法
8万
查看次数

一种在MVC 4应用程序中正确处理HttpAntiForgeryException的方法

这是场景:

我有一个登录页面,当用户签名时,它会被重定向到主页应用程序页面.然后用户使用浏览器后退按钮,现在他在登录页面上.他尝试再次登录,但现在抛出异常:

HttpAntiForgeryException(0x80004005):提供的防伪令牌适用于用户"",但当前用户是"userName".

我知道这与缓存有关.我使用自定义NoCache过滤器禁用了浏览器缓存以进行登录操作,该过滤器设置了所有必需的标头 - 无缓存,无存储,必须重新验证等.但是

  • 这不适用于所有浏览器
  • 特别是Safari(在大多数情况下是移动设备)完全忽略了这样的设置

我将尝试制作黑客并强制Safari移动刷新,但这不是我所期待的.

我想知道我是否可以:

  • 处理异常而不显示用户存在任何问题(对用户完全透明)
  • 通过更换防伪造令牌的用户名防止这个问题,这将再次允许用户登录没有这个例外,如果我涉及到浏览器的缓存黑客会在浏览器的下一个版本中停止工作.
  • 我真的不想依赖浏览器行为,因为每个行为都不同.

更新1

为了澄清一下,我知道如何处理MVC中的错误.问题是这个处理错误根本解决了我的问题.错误处理的基本思想是重定向到自定义错误页面,并带有好消息.但我希望防止发生此错误,而不是以用户可见的方式处理它.通过句柄我的意思是捕获用户名替换或其他合适的操作然后继续登录.

更新2

我添加了下面的解决方案,这对我有用.

c# asp.net-mvc antiforgerytoken

35
推荐指数
3
解决办法
2万
查看次数

在登录页面上覆盖防伪标记错误

我有一个网站收到大量以下错误:

提供的防伪令牌适用于与当前用户不同的基于声明的用户.

防伪cookie令牌和表单字段令牌不匹配.

如果防伪令牌不是针对用户但在登录页面上包含用户,我想阻止该站点抛出错误,例如:

提供的防伪令牌适用于用户"",但当前用户是"Garret".

我不希望此例外适用于登录页面以外的任何其他页面.所以我不想添加AntiForgeryConfig.SuppressIdentityHeuristicChecks = true;到整个网站.我还想让网站尽可能安全,因为它包含HIPAA数据.我该怎么做才能保证它尽可能安全,但仍然试图在登录页面上防止这个错误,因为它使用户难以使用?

该站点托管在负载平衡服务器上,但我认为这不是问题.我认为错误主要是由于使用浏览器的后退按钮,在登录前打开登录页面一段时间,已登录或多次登录.还有一些用户通过可能没有加载页面的应用程序访问它,只是尝试发布登录信息.

所以,请让我知道在尽可能安全的同时防止登录页面出现此错误的最佳选择是什么?

c# security authentication asp.net-mvc asp.net-mvc-5

5
推荐指数
1
解决办法
3074
查看次数