gpt4 book ai didi

c# - 显然是随机错误 : "Antiforgery token validation failed. The antiforgery cookie token and request token do not match."

转载 作者:太空狗 更新时间:2023-10-29 21:48:39 33 4
gpt4 key购买 nike

背景

我有一个相对较新的 ASP.NET Core 2 站点。它只在一台服务器(Windows Server 2012 R2,IIS 8.5)上运行,我每隔几天在上传更新时才重启一次网站。大约每天一次,用户的请求由于被防伪系统拒绝而失败。这些是 POST 请求,并没有什么特别之处。我在 POST 请求中包含了防伪值,并且在 99% 的情况下,POST 请求都有效。但是当他们不这样做时,stdout 日志会说,“防伪 token 验证失败。防伪 cookie token 和请求 token 不匹配。”当我使用该确切语句执行 Web 搜索时,得到的结果为零。所以我求助于 Stack Overflow。 [这不再是正确的,因为 Web 搜索现在会产生这个 Stack Overflow 问题。]

错误

我在下面包含了标准输出日志的相关部分。

info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1]
Request starting HTTP/1.1 POST [domain redacted] application/x-www-form-urlencoded 234
info: Microsoft.AspNetCore.Mvc.ViewFeatures.Internal.ValidateAntiforgeryTokenAuthorizationFilter[1]
Antiforgery token validation failed. The antiforgery cookie token and request token do not match.
Microsoft.AspNetCore.Antiforgery.AntiforgeryValidationException: The antiforgery cookie token and request token do not match.
at Microsoft.AspNetCore.Antiforgery.Internal.DefaultAntiforgery.ValidateTokens(HttpContext httpContext, AntiforgeryTokenSet antiforgeryTokenSet)
at Microsoft.AspNetCore.Antiforgery.Internal.DefaultAntiforgery.<ValidateRequestAsync>d__9.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Microsoft.AspNetCore.Mvc.ViewFeatures.Internal.ValidateAntiforgeryTokenAuthorizationFilter.<OnAuthorizationAsync>d__3.MoveNext()
info: Microsoft.AspNetCore.Mvc.RazorPages.Internal.PageActionInvoker[3]
Authorization failed for the request at filter 'Microsoft.AspNetCore.Mvc.ViewFeatures.Internal.AutoValidateAntiforgeryTokenAuthorizationFilter'.
info: Microsoft.AspNetCore.Mvc.StatusCodeResult[1]
Executing HttpStatusCodeResult, setting HTTP status code 400
info: Microsoft.AspNetCore.Mvc.RazorPages.Internal.PageActionInvoker[2]
Executed action /Index in 2.6224ms
warn: Microsoft.AspNetCore.Antiforgery.Internal.DefaultAntiforgery[1]
Antiforgery validation failed with message 'The antiforgery cookie token and request token do not match.'.

对于导致上述标准输出输出的请求,IAntiforgery.IsRequestValidAsync 通过返回 false 表示同意。请注意错误消息“防伪 cookie token 和请求 token 不匹配。”这是失败的 POST 请求和相关 cookie 的简化示例。

POST: __RequestVerificationToken= CfDJ8F9Fs4CqDFpLttT96eZw9WHjWfHO8Yawn35k4Yq3gDK5n1TDJDDiY5o86VQs1_qOVIYBydCizBU4knb7Jmq1-heGhwnMu2KmhUIiAd0xI7Sudv3GX-J0OI6wRfiPL4L1KRs2Pml8dbsDfwemewBqi18

Cookie: .AspNetCore.Antiforgery.ClRyCRmWApY=CfDJ8F9Fs4CqDFpLttT96eZw9WFtJht41WcNrmgshi2pFGwcxhr0_0hvINQc7Yl9Cbjhv-TiSNXeEctyKborLI49AcjHfWIgOmmKkbjOe7QMn8Z0WZtkQy5JcaBHKEGTu1p-La8JL8pZZqZy02Hrswpkh3I

在请求失败并出现 400 错误(使用一些错误处理中间件)后,我也多次捕获此数据:

AntiforgeryTokenSet tokens = antiforgery.GetTokens(context);
tokens.CookieToken: null
tokens.FormFieldName: "__RequestVerificationToken"
tokens.HeaderName: "RequestVerificationToken"
tokens.RequestToken: "CfDJ8F9Fs4CqDFpLttT96eZw9WH33jSw5mM8h7RpEd3vGISQTRkx1rfwm-L2lfkvXKMBc-riESmoTo_fnIjeBbRmOo5KuJHr09f8B75sQ9g_djIVeeaGwMw5KE6W1O2-7Vi03fCnwlTv8l-BWGst76Ln-ZQ"

所以这是三个字符串:

POST String:  "CfDJ8F9Fs4CqDFpLttT96eZw9WHjWfHO8Yawn35k4Yq3gDK5n1TDJDDiY5o86VQs1_qOVIYBydCizBU4knb7Jmq1-heGhwnMu2KmhUIiAd0xI7Sudv3GX-J0OI6wRfiPL4L1KRs2Pml8dbsDfwemewBqi18"
Cookie String: "CfDJ8F9Fs4CqDFpLttT96eZw9WFtJht41WcNrmgshi2pFGwcxhr0_0hvINQc7Yl9Cbjhv-TiSNXeEctyKborLI49AcjHfWIgOmmKkbjOe7QMn8Z0WZtkQy5JcaBHKEGTu1p-La8JL8pZZqZy02Hrswpkh3I"
antiforgery.GetTokens(context).RequestToken: "CfDJ8F9Fs4CqDFpLttT96eZw9WH33jSw5mM8h7RpEd3vGISQTRkx1rfwm-L2lfkvXKMBc-riESmoTo_fnIjeBbRmOo5KuJHr09f8B75sQ9g_djIVeeaGwMw5KE6W1O2-7Vi03fCnwlTv8l-BWGst76Ln-ZQ"

POST 字符串和 cookie 字符串不匹配,但根据我的经验,即使请求 ASP.NET Core 认为合法,它们也不会匹配。但奇怪的是,POST 字符串和 tokens.RequestToken 也不匹配。我认为它们应该匹配,尽管我在请求生命周期的后期捕获了 tokens.RequestToken,所以这可能与它有关。

GitHub 上的 ASP.NET Core 2

我决定查看 ASP.NET Core 2 的源代码。我找到了这个文件,尤其是第 145 行:

https://github.com/aspnet/Antiforgery/blob/dev/src/Microsoft.AspNetCore.Antiforgery/Internal/DefaultAntiforgeryTokenGenerator.cs

该行收到消息“防伪 cookie token 和请求 token 不匹配。”从第 134 行的文件中:

https://github.com/aspnet/Antiforgery/blob/dev/src/Microsoft.AspNetCore.Antiforgery/Resources.resx

所以我认为这就是消息的来源,但我仍然想知道为什么会这样。

问题

有人能帮我弄清楚为什么这些防伪 token 无法验证吗?用户的 Web 浏览器是否可能正在破坏 cookie 或 POST 数据?有没有人在这方面有经验或有任何建议?谢谢。

最佳答案

全局禁用过滤器似乎是关闭它的唯一方法。我得到了@svallis 的代码以进行视线修改:

services.AddMvc().AddRazorPagesOptions(options =>
{
options.Conventions.ConfigureFilter(new IgnoreAntiforgeryTokenAttribute());
});

https://github.com/aspnet/Mvc/issues/7012

关于c# - 显然是随机错误 : "Antiforgery token validation failed. The antiforgery cookie token and request token do not match.",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48179720/

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