par*_*ent 122 membership-provider asp.net-mvc-4
我正在构建单页面应用程序并遇到防伪令牌问题.
我知道为什么问题发生我只是不知道如何解决它.
发生以下情况时,我收到错误消息:
防伪令牌适用于用户"",但当前用户是"用户名"
发生这种情况的原因是因为我的应用程序是100%单页,并且当用户通过ajax帖子成功登录时/Account/JsonLogin,我只是使用从服务器返回的"已验证视图"切换出当前视图但不重新加载页.
我知道这就是原因,因为如果我在步骤3和4之间简单地重新加载页面,就没有错误.
所以似乎@Html.AntiForgeryToken()在加载的表单中仍然为旧用户返回一个令牌,直到重新加载页面.
如何更改@Html.AntiForgeryToken()为新的经过身份验证的用户返回令牌?
我注入了新的GenericalPrincipal带有自定义IIdentity每个Application_AuthenticateRequest这样的时候@Html.AntiForgeryToken()被调用HttpContext.Current.User.Identity,其实我与自定义标识IsAuthenticated属性设置为true,但@Html.AntiForgeryToken似乎仍然呈现为老用户令牌,除非我做一个页面重新加载.
epi*_*isx 164
发生这种情况是因为防伪令牌将用户的用户名作为加密令牌的一部分嵌入,以便更好地进行验证.当您第一次调用时,@Html.AntiForgeryToken()用户未登录,因此令牌将具有用户名的空字符串,在用户登录后,如果您不替换防伪令牌,则它将不会通过验证,因为初始令牌是匿名用户,现在我们有一个具有已知用户名的经过身份验证的用户.
您有几个选项可以解决此问题:
就在这个时候让你的SPA做一个完整的POST,当页面重新加载时,它将有一个防伪标记,嵌入了更新的用户名.
@Html.AntiForgeryToken()在登录后使用正确和正确的部分视图,执行另一个AJAX请求并使用请求的响应替换现有的防伪标记.
只需禁用防伪验证执行的身份检查即可.将以下内容添加到Application_Start方法中:AntiForgeryConfig.SuppressIdentityHeuristicChecks = true.
小智 21
要修复错误,您需要将OutputCache数据注释放在"获取ActionResult登录"页面上:
[OutputCache(NoStore=true, Duration = 0, VaryByParam= "None")]
public ActionResult Login(string returnUrl)
Run Code Online (Sandbox Code Playgroud)
A. *_*rel 15
当您已通过身份验证登录时,将显示该消息。
这个 Helper 做的事情和[ValidateAntiForgeryToken]属性完全一样。
System.Web.Helpers.AntiForgery.Validate()
Run Code Online (Sandbox Code Playgroud)
[ValidateAntiForgeryToken]从控制器中删除属性并将此助手置于操作方法中。
因此,当用户已经通过身份验证时,重定向到主页,否则在此验证后继续验证有效的防伪令牌。
if (User.Identity.IsAuthenticated)
{
return RedirectToAction("Index", "Home");
}
System.Web.Helpers.AntiForgery.Validate();
Run Code Online (Sandbox Code Playgroud)
要尝试重现该错误,请按以下步骤操作: 如果您在登录页面上并且未通过身份验证。如果您复制该选项卡并使用第二个选项卡登录。如果您返回登录页面的第一个选项卡,并尝试在不重新加载页面的情况下登录……您会遇到此错误。
小智 8
我遇到了同样的问题,这个肮脏的hack至少在我可以更干净的方式解决之前就将其修复。
public ActionResult Login(string returnUrl)
{
if (AuthenticationManager.User.Identity.IsAuthenticated)
{
AuthenticationManager.SignOut();
return RedirectToAction("Login");
}
Run Code Online (Sandbox Code Playgroud)
...
| 归档时间: |
|
| 查看次数: |
76005 次 |
| 最近记录: |