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

时间:2012-01-20 01:24:41

标签: c# asp.net-mvc-3 csrf

我们最近在我们正在ASP.Net MVC 3中使用的网站上实施了CSRF保护。

使用一些技巧,我们有一个有效的解决方案。

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

当启用自定义错误时,如果设置了500状态代码,则会得到403.

抛出的异常是一个HttpAntiForgeryException,它应该是我对MVC源的检查中的500。

它被抛入ActionFilterAttribute内,是否将异常包装在403内?

IIS做了什么奇怪的事吗?

任何想法都会受到赞赏。

干杯,

1 个答案:

答案 0 :(得分:0)

我实施了MVC 3反CSRF解决方案,并且在故意使检查失败时(通过在获取之后和发布之前抑制客户端上的cookie),我从未收到403代码。

检查具有ValidateAntiForgeryToken属性的操作。使用RemoteOnly设置cutomErrors,然后选择On,然后选择Off。测试了两次,第一次在Cassini开发服务器上,第二次在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();