【问题标题】:ASP.MVC antiforgery token and cryptographic errorsASP.MVC 防伪令牌和加密错误
【发布时间】:2010-12-12 07:58:09
【问题描述】:

我正在使用 ELMAH 来处理我的 MVC 站点中的错误,并且在过去几周我注意到我收到了一些 CryptographicExceptions 抛出。消息是:

System.Security.Cryptography.CryptographicException:填充无效且无法删除。

System.Web.Mvc.HttpAntiForgeryException: 所需的防伪令牌不是 提供或无效。 ---> System.Web.HttpException:验证 视图状态 MAC 失败。如果这 应用程序由 Web Farm 托管或 集群,确保 配置指定相同 验证密钥和验证 算法。无法使用自动生成 在一个集群中。 --->

应用程序没有在集群中运行,我似乎无法重现这些错误。它们看起来像有效请求——不是手工制作的帖子——并且确实包含 __RequestVerificationToken cookie。我在页面上的表单(我的登录表单)内确实有所需的 HTML 帮助器。

我还没有收到任何用户投诉,所以我假设它最终适用于尝试登录的任何人,但我想知道为什么会发生这种情况。

其他任何人看到这种行为或对如何诊断异常有任何想法 - 就像我说的,我不能让它失败。在 FF 中删除 cookie 会出现不同的错误。修改 cookie(更改或删除内容)也会导致不同的错误,修改页面上隐藏令牌输入的内容也是如此。

【问题讨论】:

    标签: asp.net-mvc exception antiforgerytoken


    【解决方案1】:

    我不确定是否存在相关性,但在添加排除我的登录操作的 robots.txt 文件后,我不再看到这些错误。我怀疑这与爬虫点击页面并尝试调用登录操作有关。

    编辑:在应用程序池回收后接收旧 cookie 时,我也看到了这个问题。我已经明确设置 machineKey,以便在应用程序重新启动时对验证/解密密钥的更改不会影响可能重新发送的旧 cookie。

    在更新站点并使用固定的 machineKey 后,我发现我仍然从拥有旧版本 cookie 的人那里收到这些错误。作为临时解决方法,我添加了以下 Application_Error 处理程序:

        public void Application_Error()
        {
            var exception = Server.GetLastError().GetBaseException();
            if (exception is System.Security.Cryptography.CryptographicException)
            {
                Server.ClearError();
                if (Request.IsAuthenticated)
                {
                    var form = new FormsAuthenticationWrapper();
                    form.SignOut();
                    Session.Clear();
                }
                Response.Cookies.Clear();
                Response.Redirect( "~" );
            }
        }
    

    【讨论】:

    • 类似经历——我的博客在迁移到 ASP.NET MVC 2 后开始间歇性崩溃。添加了 machineKey,问题就消失了。
    【解决方案2】:

    我不太确定这与防伪系统有什么特别的关系,内部异常状态为“验证视图状态 MAC 失败。”据我所知,防伪系统的默认基础架构依赖于视图状态(实际上如果你take a look here 你会看到依赖和恐怖(底部的 CreateFormatterGenerator 方法)。

    至于为什么 viewstate mac 在虚假请求上失败,我不确定——但考虑到反序列化防伪令牌(处理整个虚假请求)存在的恐惧,我一点也不惊讶。 .

    【讨论】:

      猜你喜欢
      • 2018-01-16
      • 2017-07-21
      • 2023-03-30
      • 2019-03-05
      • 2018-06-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多