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

tva*_*son 7 asp.net-mvc exception antiforgerytoken

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

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

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

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

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

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

tva*_*son 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( "~" );
        }
    }
Run Code Online (Sandbox Code Playgroud)