0

У меня есть приложение ASP.NET MVC 5, но это не имеет значения, если это MVC 3, 4 или нет. У меня установлен модуль NWebSec 3.0 с включенной проверкой перенаправления. У меня есть метод Application_Error (даже если у меня не было одна проблема та же!):Как перенаправить на контроллер ошибок после NWebsec.Core.Exceptions.RedirectValidationException

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 -s ответы уже, но я не могу понять это. Можете ли вы указать мне ответ на такую ​​проблему или предоставить примерную реализацию?

ответ

1

Если у вас есть действие RedirectValidation на качестве ErrorsController, что-то, как это должно работать:

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); 
} 

Это в основном то же самое, один из связанных ответов делает, за исключением того, что вы справляетесь, что очень специфический тип исключения , Я делаю что-то подобное для исключений, возникающих из-за превышения нашего предела размера загрузки.

0

Я столкнулся с той же проблемой. 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(), если вы хотите обойти его для своих собственных ошибок.

+0

Благодарим за отзыв! Но моя цель - настроить обработку исключений из действительно опасных перенаправлений. Я не хочу, чтобы белый список опасности, которая не находится на том же хосте - как вы можете видеть из примера, я намеренно перенаправляю на «http://www.deshow.net/d/file/travel/2010-04 /bing-landscape-wallpaper-845-2.jpg "только ради сателлитов. Когда обнаружено опасное перенаправление, NWebSec выбрасывает это исключение, и я получаю его в global.asax. Мне нужно затем перенаправить на метод действия RedirectError() ErrorController. –

Смежные вопросы