如何在NWebsec.Core.Exceptions.RedirectValidationException之后重定向到错误控制器

时间:2015-01-22 11:00:35

标签: asp.net asp.net-mvc asp.net-mvc-4 asp.net-mvc-5 response.redirect

我有ASP.NET MVC 5应用程序,但它是否是MVC 3,4不重要。我安装了NWebSec 3.0模块并启用了重定向验证。我有Application_Error方法(即使我没有一个问题是相同的!):

    protected void Application_Error(object sender, EventArgs e)
    {
        HttpContext httpContext = ((MvcApplication)sender).Context;
        Exception exception = Server.GetLastError();
        if(exception is NWebsec.Core.Exceptions.RedirectValidationException)
        {
            Trace.WriteLine("How to redirect from here to ErrorController/Index?");
        }
        else
        {
            Trace.WriteLine("How to redirect from here to ErrorController/Index?");

Herer是HomeControllers中的两种测试方法:

    public ActionResult Redirect()
    {
        return new RedirectResult("http://www.deshow.net/d/file/travel/2010-04/bing-landscape-wallpaper-845-2.jpg");
    }

    public ActionResult ParseError()
    {
        int.Parse("test");
        return View();
    }

我有标准的共享错误视图和

 <customErrors mode="On" defaultRedirect="~/Error" />

启用。

我希望无论出现什么错误,我都会被重定向到错误视图。但是当我调用Redirect方法时,情况并非如此。不知何故,当抛出重定向错误时,会绕过标准的“自定义错误”机制,并且不会显示标准错误视图。

另一个细节是,在ParseError()被点击之后,然后没有点击Application_Error并且显示标准的“自定义错误”视图,但是当点击Redirect()时,没有“自定义错误”视图但是黄色死亡屏幕。这让我觉得我可能没有正确理解http模块的“管道”。

NWebSec与错误重定向相交并抛出NWebsec.Core.Exceptions.RedirectValidationException。我想是这样的,因为NwebSec已注册为模块

    <system.webServer>
    <modules>
      ...
    <add name="NWebsecHttpHeaderSecurityModule" type="NWebsec.Modules.HttpHeaderSecurityModule, NWebsec, Version=3.2.0.0, Culture=neutral, PublicKeyToken=3613da5f958908a1" />
    ...
    </modules>
    </system.webServer>

我已经阅读了the - e - e - e - e - 已有答案,但我无法弄明白。你能指出我对这个问题的答案或提供样本实施吗?

2 个答案:

答案 0 :(得分:1)

假设您对ErrorsController有一个RedirectValidation操作,这样的事情应该有效:

protected void Application_Error(object sender, EventArgs e)
{
    var routeData = new RouteData();
    routeData.Values["controller"] = "error";

    var exception = Server.GetLastError();

    if(exception is NWebsec.Core.Exceptions.RedirectValidationException)
    {
        routeData.Values["action"] = "redirectvalidation";
    }
    else
    {
        // handle everything else
    }

    Response.Clear();
    Server.ClearError();

    // Avoid IIS7 getting in the middle
    Response.TrySkipIisCustomErrors = true;

    IController errorsController = new Controllers.ErrorController();
    HttpContextBase wrapper = new HttpContextWrapper(Context);

    var rc = new RequestContext(wrapper, routeData);
    errorsController.Execute(rc);
}

除了您处理特定类型的异常之外,您的链接答案之一基本相同。我为超出上传大小限制的例外做了类似的事情。

答案 1 :(得分:0)

我遇到了同样的问题。 documentation解释说3.x版本在重定向上略显机会主义。因此,您必须将已批准的网址重定向列入白名单(也允许自定义端口)。

在您的配置中,更新allowSameHostRedirectsToHttps节点。

<redirectValidation enabled="true">
  <allowSameHostRedirectsToHttps enabled="true" />
  <!--<allowSameHostRedirectsToHttps enabled="true" httpsPorts="4567, 7654"/>-->
  <add allowedDestination="http://www.nwebsec.com/"/>
  <add allowedDestination="https://www.google.com/accounts/"/>
</redirectValidation>

由于在发送标头之前抛出错误,可能会引发错误。文档说你可以调用Response.Flush(),如果你想绕过它自己的自定义错误。