【问题标题】:Form doesn't have duplicate key still getting "The anti-forgery token could not be decrypted" error表单没有重复密钥仍然出现“无法解密防伪令牌”错误
【发布时间】:2021-12-08 09:19:33
【问题描述】:

我在我的主 .cshtml 页面中使用了 @Html.AntiForgeryToken() <div ng-controller="MainController as vm"> 我已经按照this实现了。

var headers = actionContext.Request.Headers;
                var tokenCookie = headers
                    .GetCookies()
                    .Select(c => c["__RequestVerificationToken_L21vYmlsZQ2"]) //AntiForgeryConfig.CookieName
                    .FirstOrDefault();

                var tokenHeader = string.Empty;
                if (headers.Contains("X-XSRF-Token"))
                {
                    tokenHeader = headers.GetValues("X-XSRF-Token").FirstOrDefault();
                    AntiForgery.Validate(tokenCookie != null ? tokenCookie.Value : null, tokenHeader);
                }   

@Html.AntiForgeryToken() 正在生成密钥(例如:“xyz123”),同时在 OnActionExecuting() 中进行验证我得到不同的密钥(例如:“pqr678”)并且在 AntiForgery.Validate(tokenCookie != null ? tokenCookie.Value : null, tokenHeader); 中出现以下错误

无法解密防伪令牌。如果此应用程序由 Web Farm 或集群托管,请确保所有计算机都运行相同版本的 ASP.NET 网页,并且配置指定了显式加密和验证密钥。

注意:我没有重复的令牌,我也尝试在 web.config ref 中添加机器密钥

【问题讨论】:

  • 为什么选择__RequestVerificationToken_L21vYmlsZQ2 cookie?不应该是__RequestVerificationToken吗?
  • @WillHuang ,在actionContext.Request.Headers 中,名称是__RequestVerificationToken_L21vYmlsZQ2,我尝试使用__RequestVerificationTokenAntiForgeryConfig.CookieName,但这没有用。
  • 您能否提供一个示例项目到 GitHub,以便我了解您面临的问题是什么?

标签: angularjs asp.net-mvc asp.net-web-api antiforgerytoken


【解决方案1】:

您应该在您的操作中使用 ValidateAntiForgeryKey 属性。

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Manage(ManageUserViewModel model)
{

}

另外,您可以尝试在机器配置中添加validationKey="AutoGenerate"。如下:

<machineKey validationKey="AutoGenerate">

【讨论】:

    猜你喜欢
    • 2018-06-01
    • 2017-07-21
    • 2023-03-30
    • 2020-03-09
    • 2017-06-25
    • 2016-03-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多