HttpAntiForgeryException被视为403和500,具体取决于是否启用自定义错误

本文关键字:取决于 是否 启用 错误 自定义 HttpAntiForgeryException | 更新日期: 2023-09-27 18:21:04

我们最近在ASP.Net MVC 3中开发的一个网站上实现了CSRF保护。

使用一些混杂的技术,我们有了一个可行的解决方案。

然而,我们的应用程序错误处理部分无法正常工作,因为根据是否打开自定义错误,为异常设置的状态代码不同。

当自定义错误打开时,我们会得到403,当关闭时,会设置500状态代码。

抛出的异常是HttpAntiForgeryException,根据我对MVC源代码的检查,它应该是500。

它被抛出到ActionFilterAttribute中,这是否将异常封装在403中?

IIS是否在做一些奇怪的事情?

任何想法都将不胜感激。

干杯,

HttpAntiForgeryException被视为403和500,具体取决于是否启用自定义错误

我实现了MVC 3反CSRF解决方案,当我故意让检查失败时(通过在get之后和post之前抑制客户端的cookie),我从未收到403代码。

对具有ValidateAntiForgeryToken属性的操作进行检查。cutomErrors设置为RemoteOnly,然后是On,然后是Off。测试了两次,第一次在Cassini dev服务器上,第二次在IIS6上。

我总是收到500的响应代码。

我想问题出在您正在使用的customErrors处理中。您还应该检查是否有任何httpModule对错误事件执行一些自定义逻辑。(如果您使用MVC HandleError属性,则不太可能,因为此MVC customError处理会在HttpModule处理之前捕获错误,这样就永远不会看到错误。)

如果您的问题中没有更多关于您使用的customError处理机制的详细信息,则很难给出更多指导。

我的既不是MVC标准(使用HandleError作为控制器属性、操作属性或全局过滤器),也不是经典的asp.net。它也不是ELMAH。由于"历史"原因,我处理Application_Error事件中的错误(因为我发现支持ISS 6和7错误处理更容易,我需要这样做,直到我们的服务器迁移完成)。Application_error事件中我的错误处理逻辑代码如下:

var statusCode = 500;
var ex = Server.GetLastError();
if (ex != null)
{
    var httpEx = ex as HttpException;
    if (httpEx != null)
    {
        // HttpAntiForgeryException is HttpException and gets received here,
        // so its statusCode is what I get here.
        statusCode = httpEx.GetHttpCode();
    }
}
// Some logging logic then
if (!Context.IsCustomErrorEnabled)
    return;
Response.ClearContent();
Response.StatusCode = statusCode;
// Rendering custom error page in response then
Server.ClearError();