【问题标题】:How to Redirect to Error controller after NWebsec.Core.Exceptions.RedirectValidationExceptionNWebsec.Core.Exceptions.RedirectValidationException 后如何重定向到错误控制器
【发布时间】:2015-03-21 03:30:33
【问题描述】:

我有 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?");

下面是 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-s 的答案,但我无法弄清楚。您能否指出此类问题的答案或提供示例实现?

【问题讨论】:

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


    【解决方案1】:

    我遇到了同样的问题。 documentation 解释说 3.x 版本在重定向上有点投机取巧。因此,您必须将批准的 url 重定向列入白名单(也允许自定义端口)。

    在您的配置中,更新 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()。

    【讨论】:

    • 感谢您的提示!但我的目标是设置真正危险的重定向的异常处理。我不想将不在同一主机上的危险列入白名单 - 正如您从示例中看到的那样,我故意重定向到“deshow.net/d/file/travel/2010-04/…”只是为了测试。当检测到危险的重定向时,NWebSec 会抛出这个异常,我在 global.asax 中得到它。然后我需要重定向到 ErrorController 的 RedirectError() 操作方法。
    【解决方案2】:

    假设您在 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);
    }
    

    这基本上与您的链接答案之一正在做的事情相同,除了您处理那种非常特定类型的异常。对于超出我们的上传大小限制导致的异常,我会执行类似的操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-21
      • 2017-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多