2015-04-16 10 views
5

Używam Owina do hostowania kontrolerów WebAPI. Mam Owin middleware, który dokonuje uwierzytelnienia i ustawia następujące jeśli uwierzytelnianie nie powiedzie:Niestandardowa strona błędu podczas używania Owin

context.Response.StatusCode = (int) HttpStatusCode.Unauthorized; 

Kiedy to nastąpi chcę wyświetlić stronę HTML z niektórych instrukcji dla użytkownika. (Np. "Musisz się zalogować")

W tej chwili przekierowuję użytkownika do strony accessdenied.html, ale wolałbym, aby odmowa dostępu została wyświetlona bezpośrednio, bez przekierowania użytkownika (Nie chcę zmieniać pola Location w przeglądarce internetowej).

Zakładam, że mógłbym wygenerować kod HTML w locie i dodać go do odpowiedzi, na przykład czytając zawartość HTML z zasobu.

Moje pytanie brzmi: Czy można automatycznie wyświetlić niestandardową stronę błędu z dostępem, korzystając z konfiguracji? W „tradycyjnie,” ASP.NET, można było założyć CustomErrors w pliku web.config, ale to nie wydaje się, aby pracować z Owin selfhost:

<customErrors> 
    <error statusCode="401" redirect="~/accessdenied.html"/> 
</customErrors> 

Odpowiedz

3

w poprzednim projekcie kopalni musiałem użyć Owin oprogramowanie pośrednie w ten sposób:

 app.Use((owinContext, next) => 
     {   
      return next().ContinueWith(x => 
      { 
       if (owinContext.Response.StatusCode == 500 /*or 401 , etc*/) 
       {       
        //owinContext.Response.Redirect(VirtualPathUtility.ToAbsolute("~/Home/Error")); 
        //this should work for self-host as well 
        owinContext.Response.Redirect(owinContext.Request.Uri.AbsoluteUri.Replace(request.Uri.PathAndQuery, request.PathBase + "/Home/Error")); 
       } 
      });     
     }); 

musisz zarejestrować oprogramowanie pośrednie przed wszystkimi innymi.

W tym przypadku przekierowuję użytkownika do widoku błędu, ale jako ogólną praktykę powiedziałbym, że lepiej jest mieć statyczną stronę HTML.

Właściwie wydaje mi się, że istnieje żądanie rozszerzenia dotyczące obsługi wyjątków globalnych. Have a look at this link...

+0

Nie będzie działać dla hostów, ponieważ 'VirtualPathUtility' jest częścią' System.Web' i wymaga, aby usługi IIS działały poprawnie. –

+0

Powinieneś użyć tego: 'request.Uri.AbsoluteUri.Replace (request.Uri.PathAndQuery, request.PathBase +"/Home/Error ")' – tmoreira

+0

Jeśli wykonasz Response.Redirect, zmieni kod statusu HTTP na 302. –

0

Natrafiłem na ten sam problem. Próbowałem ustawić kod statusu, a następnie wykonuję przekierowanie do strony 401. Ale Przekierowanie zmienia StatusCode na 302.

Wpadłem na rozwiązanie czytania 401.html zapisując je w odpowiedzi. To zadziałało dla mnie.

context.Response.StatusCode = 401; 
var path = HttpContext.Current.Server.MapPath("/401.html"); 
var html = System.IO.File.ReadAllText(path, Encoding.UTF8); 
context.Response.Write(html); 
+0

Owin context daje możliwość przekierowania. – Rajat

-1

owin zapewnia opcję przekierowania do strony błędu

context.Response.Redirect (errUrl); // kontekst jest owinContext

Nie musisz mieć żadnej specjalnej metody RedirectResult lub RedirectToAction.

+1

Problem polega na tym, że kod błędu 404 pojawia się dopiero po wywołaniu "następnego" oprogramowania pośredniego. który wysyła błąd do użytkownika –

Powiązane problemy