我们最近在我们正在ASP.Net MVC 3中使用的网站上实施了CSRF保护。
使用一些技巧,我们有一个有效的解决方案。
但是我们的错误处理部分应用程序无法正常工作,因为根据是否打开自定义错误,为异常设置的状态代码会有所不同。
当启用自定义错误时,如果设置了500状态代码,则会得到403.
抛出的异常是一个HttpAntiForgeryException,它应该是我对MVC源的检查中的500。
它被抛入ActionFilterAttribute内,是否将异常包装在403内?
IIS做了什么奇怪的事吗?
任何想法都会受到赞赏。
干杯,
答案 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();