7

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

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

System.Web.Mvc.HttpAntiForgeryException:未提供所需的防伪令牌或无效。---> System.Web.HttpException:视图状态 MAC 验证失败。如果此应用程序由 Web Farm 或集群托管,请确保配置指定相同的 validationKey 和验证算法。AutoGenerate 不能在集群中使用。--->

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

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

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

4

2 回答 2

4

我不确定是否存在相关性,但在添加排除我的登录操作的 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( "~" );
        }
    }
于 2009-11-24T21:20:44.163 回答
1

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

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

于 2009-11-03T22:40:35.650 回答