gpt4 book ai didi

asp.net-mvc - __RequestVerificationToken 并不总是被创建

转载 作者:行者123 更新时间:2023-12-02 23:25:27 25 4
gpt4 key购买 nike

我们有一个包含多种表单的页面。每个都有自己的@Html.AntiForgeryToken() 。在我的本地计算机上一切都很棒。

我们部署到 Azure (PAAS),但 __RequestVerificationToken 并非针对每个请求都创建。有时它在那里,有时我得到所需的防伪 cookie 不存在,并且很少得到 token 不匹配错误

我现在完全一无所知。我不知道我们的代码或Azure环境是否有问题?这些形式中没有 ajax。

我们添加了 <machineKey>部分到我们的web.config。没有缓存。有时它从第一次就出现在新设备上。

最佳答案

在花费大量时间进行调查并结合使用 Sentry 和 Azure Web 服务器日志后,我发现了上述错误的 2 个主要原因:

1) 在手机上,当浏览器处于后台时,操作系统可能会突然停止浏览器以释放资源。发生这种情况时,页面通常存储在手机驱动器上,并在重新打开浏览器时从那里重新加载。

然而,问题是,此时,作为 session cookie 的防伪 token 已经过期,因为这本质上是一个新 session 。因此,页面加载时没有防伪 Cookie,而是使用上一个 session 中的 HTML。这会导致所需的防伪 cookie 不存在异常。

2) 虽然看似相关,但标记不匹配异常通常只是无关紧要的相关。原因似乎是同时打开多个选项卡的用户行为。

仅当用户到达包含表单的页面时才会分配防伪 Cookie。这意味着他们可以访问您的主页,并且没有防伪 cookie。然后他们可以使用中键单击打开多个选项卡。多个选项卡是多个并行请求,每个请求都没有防伪 cookie。

由于这些请求没有防伪 cookie,因此 ASP.NET 会为每个请求生成一个单独的伪随机 token ,并在表单中使用该 token ;但是,仅保留最后接收到的 header 的结果。这意味着所有其他页面将在页面上具有无效 token ,因为它们的防伪 cookie 已被覆盖。

对于解决方案,我创建了一个全局过滤器,应确保

  1. 防伪 cookie 会分配在任何页面上,即使该页面没有表单,并且
  2. 防伪 cookie 不受 session 限制。应调整其生命周期以匹配用户登录 token ,但它应在 session 之间持续存在,以防移动设备在没有 session 的情况下重新加载页面。

下面的代码是 FilterAttribute,必须将其添加到 FilterConfig.cs 中作为全局过滤器。 请注意,虽然我不认为这会造成安全漏洞,但我绝不是安全专家,因此欢迎任何意见。

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class AntiForgeryFilter : FilterAttribute, IActionFilter
{
public void OnActionExecuting(ActionExecutingContext filterContext)
{
var cookie = filterContext.HttpContext.Request.Cookies.Get(AntiForgeryConfig.CookieName);
var addCookie = true;
if (string.IsNullOrEmpty(cookie?.Value))
{
cookie = filterContext.HttpContext.Response.Cookies.Get(AntiForgeryConfig.CookieName);
addCookie = false;
}
if (string.IsNullOrEmpty(cookie?.Value))
{
AntiForgery.GetTokens(null, out string cookieToken, out string _);
cookie = new HttpCookie(AntiForgeryConfig.CookieName, cookieToken)
{
HttpOnly = true,
Secure = AntiForgeryConfig.RequireSsl
};
}
cookie.Expires = DateTime.UtcNow.AddYears(1);
if(addCookie) filterContext.HttpContext.Response.Cookies.Add(cookie);
}

public void OnActionExecuted(ActionExecutedContext filterContext)
{
}
}

关于asp.net-mvc - __RequestVerificationToken 并不总是被创建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46683513/

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