我正在构建一个单页应用程序并遇到防伪令牌问题。
我知道为什么会出现这个问题,只是不知道如何解决。
当发生以下情况时我收到错误:
- 未登录用户加载对话框(带有生成的防伪令牌)
- 用户关闭对话框
- 用户登录
- 用户打开相同的对话框
- 用户在对话框中提交表单
防伪令牌适用于用户“”,但当前用户是
“用户名”
发生这种情况的原因是因为我的应用程序是 100% 单页,当用户通过 ajax post 成功登录时/Account/JsonLogin
,我只是用服务器返回的“经过身份验证的视图”切换当前视图,但是不要重新加载页面。
我知道这是原因,因为如果我在步骤 3 和 4 之间简单地重新加载页面,就不会出现错误。
所以看来@Html.AntiForgeryToken()
在加载的表单中仍然会为旧用户返回一个令牌,直到重新加载页面。
我该如何改变@Html.AntiForgeryToken()
为新的经过身份验证的用户返回令牌?
我注入一个新的GenericalPrincipal
与定制IIdentity
在每一个Application_AuthenticateRequest
所以到时候@Html.AntiForgeryToken()
被叫到HttpContext.Current.User.Identity
实际上是我的自定义身份IsAuthenticated
属性设置为 true 但@Html.AntiForgeryToken
除非我重新加载页面,否则似乎仍然会为旧用户呈现令牌。
发生这种情况是因为防伪令牌将用户的用户名嵌入到加密令牌中以实现更好的验证。当您第一次拨打电话时@Html.AntiForgeryToken()
用户未登录,因此令牌将有一个空字符串作为用户名,用户登录后,如果不替换防伪令牌,它将不会通过验证,因为初始令牌是针对匿名用户的,现在我们拥有一个具有已知用户名的经过身份验证的用户。
您有几种选择来解决这个问题:
-
这次让您的 SPA 执行完整的 POST,当页面重新加载时,它将有一个防伪令牌,其中嵌入了更新的用户名。
-
仅查看部分视图@Html.AntiForgeryToken()
登录后,立即执行另一个 AJAX 请求,并将现有的防伪令牌替换为请求的响应。
注意设置AntiForgeryConfig.SuppressIdentityHeuristicChecks = true
不会禁用用户名验证,它只是更改验证的工作方式。请参阅ASP.NET MVC 文档, the 源代码读取该属性的位置,以及源代码无论该配置的值如何,都会验证令牌中的用户名。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)