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(更改或删除内容)也会导致不同的错误,修改页面上隐藏令牌输入的内容也会导致错误.
我不确定是否存在相关性,但在添加排除我的登录操作的 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)