ASP.MVC防伪令牌和加密错误

时间:2009-11-02 15:38:34

标签: asp.net-mvc exception antiforgerytoken

我正在使用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(更改或删除内容)也会导致不同的错误,修改页面上隐藏令牌输入的内容也是如此。

2 个答案:

答案 0 :(得分:4)

我不确定是否存在关联,但在添加了排除我的登录操作的robots.txt文件后,我不再看到这些错误。我怀疑它与爬行器命中页面并尝试调用登录操作有关。

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

更新网站并转到固定的机器密钥后,我发现我仍然从之前版本的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( "~" );
        }
    }

答案 1 :(得分:1)

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

至于为什么viewstate mac在假请求上失败,我不确定 - 但考虑到反序列化反伪造令牌(处理整个假请求)中存在的恐怖,它根本不会让我感到惊讶。