gpt4 book ai didi

asp.net-mvc-4 - 防伪 token 适用于用户 "",但当前用户是 "username"

转载 作者:行者123 更新时间:2023-12-02 07:41:08 31 4
gpt4 key购买 nike

我正在构建一个单页应用程序,但遇到了防伪 token 问题。

我知道为什么会出现这个问题,但我只是不知道如何解决它。

发生以下情况时出现错误:

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

Anti forgery token is meant for user "" but the current user is "username"

发生这种情况的原因是因为我的应用程序是 100% 单页,当用户通过 ajax post 成功登录到 /Account/JsonLogin 时,我只需使用以下命令切换当前 View 即可从服务器返回“经过身份验证的 View ”,但不重新加载页面。

我知道这是原因,因为如果我在步骤 3 和 4 之间简单地重新加载页面,就不会出现错误。

因此,加载表单中的 @Html.AntiForgeryToken() 似乎仍然为旧用户返回 token ,直到重新加载页面为止。

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

我在每个 Application_AuthenticateRequest 上注入(inject)一个带有自定义 IIdentity 的新 GenericPrincipal,所以到了 @Html.AntiForgeryToken() 被调用 HttpContext.Current.User.Identity 实际上是我的自定义身份,其中 IsAuthenticated 属性设置为 true,但 @Html.AntiForgeryToken code> 似乎仍然为旧用户呈现 token ,除非我重新加载页面。

最佳答案

发生这种情况是因为防伪 token 将用户的用户名嵌入到加密 token 中,以实现更好的验证。当您第一次调用@Html.AntiForgeryToken()时用户未登录,因此 token 将有一个空字符串作为用户名,用户登录后,如果不替换防伪 token ,它将不会通过验证,因为初始 token 是针对匿名用户的,现在我们拥有一个具有已知用户名的经过身份验证的用户。

您有几种选择来解决此问题:

  1. 这一次让您的 SPA 执行完整的 POST,当页面重新加载时,它将具有嵌入更新后的用户名的防伪 token 。

  2. 仅查看 @Html.AntiForgeryToken() 的部分 View 登录后,立即执行另一个 AJAX 请求,并将现有的防伪 token 替换为请求的响应。

请注意设置 AntiForgeryConfig.SuppressIdentityHeuristicChecks = true不会禁用用户名验证,它只是更改验证的工作方式。请参阅ASP.NET MVC docssource code读取该属性的位置,以及 source code无论该配置的值如何,都会验证 token 中的用户名。

关于asp.net-mvc-4 - 防伪 token 适用于用户 "",但当前用户是 "username",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14970102/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com