asp.net-mvc - ASP.MVC 防伪 token 和加密错误

标签 asp.net-mvc exception antiforgerytoken

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

System.Security.Cryptography.CryptographicException: Padding is invalid and cannot be removed.

System.Web.Mvc.HttpAntiForgeryException: A required anti-forgery token was not supplied or was invalid. ---> System.Web.HttpException: Validation of viewstate MAC failed. If this application is hosted by a Web Farm or cluster, ensure that configuration specifies the same validationKey and validation algorithm. AutoGenerate cannot be used in a cluster. --->


该应用程序未在集群中运行,我似乎无法重现这些错误。它们看起来像是有效的请求——不是手工制作的帖子——并且确实包含 __RequestVerificationToken cookie。我在页面上的表单(我的登录表单)内确实有所需的 HTML 帮助程序。
我还没有收到任何用户投诉,所以我假设它最终适用于尝试登录的任何人,但我想知道为什么会发生这种情况。
任何其他人看到这种行为或对如何诊断异常有任何想法——就像我说的,我不能让它失败。在 FF 中删除 cookie 会出现不同的错误。修改 cookie(更改或删除内容)也会导致不同的错误,就像修改页面上隐藏 token 输入的内容一样。

最佳答案

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

编辑 :在应用程序池回收后接收旧 cookie 时,我也看到了这个问题。我已经使用显式设置 machineKey 以便在应用程序重新启动时对验证/解密 key 的更改不会影响可能重新发送的旧 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 - ASP.MVC 防伪 token 和加密错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1662016/

相关文章:

c# - 网络 MVC : How to determine if you're currently on a specific view

asp.net-mvc - 如何在 MVC 中省略/防止数据发送到 Controller 中的 POST 方法

c# - 记录即发即弃任务中的异常

java - 如何从 TransformerException 中提取有用的信息

C# 问题 - 如何使用 try 中代码的特定可能异常填充 catch 语句?

c# - 在 SPA 应用程序的 ASP.NET 5 中正确使用 AntiForgery token ?

cookies - 反伪造 token Cookie 仅在嵌入 Iframe 时才出现在请求 header 中

c# - 使用异步操作获取 404 (Task<ActionResult>)

asp.net-mvc - Entity Framework Code First 数据库文件未在 APP_DATA 中创建,但查询有效

c# - 在 C# 中发布到表单 - 传递 antiforgerytoken