2015-04-16 15 views
5

Ich verwende Owin zum Hosten von WebAPI-Controllern. Ich habe Owin Middleware, die Authentifizierung durchführt und stellt die folgende, wenn die Authentifizierung fehlschlägt:Benutzerdefinierte Fehlerseite bei der Verwendung von Owin

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

Wenn dies geschieht Ich möchte dem Benutzer eine HTML-Seite mit einigen Anweisungen angezeigt werden soll. (Wie, "Sie müssen sich anmelden.")

Im Moment bin ich nur Umleiten des Benutzers auf eine accessdenied.html-Seite, aber ich würde es vorziehen, wenn der Zugriff verweigert direkt angezeigt wurde, ohne dass der Benutzer umgeleitet wird (Ich möchte nicht, dass sich das Standortfeld im Webbrowser ändert).

Ich nehme an, ich könnte nur den HTML-Code im laufenden Betrieb generieren und der Antwort hinzufügen, indem ich beispielsweise den HTML-Inhalt einer Ressource lese.

Meine Frage ist: Ist es möglich, eine benutzerdefinierte Access-verweigerte Fehlerseite automatisch über die Konfiguration anzuzeigen? In „traditioinal“ ASP.NET war es möglich, in web.config custom einzurichten, aber dies scheint nicht mit Owin Selfhost zu arbeiten:

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

Antwort

3

In einem früheren Projekt von mir hatte ich einen Owin verwenden Middleware wie folgt:

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

Sie müssen die Middleware vor allen anderen registrieren.

In diesem Fall werde ich den Benutzer auf eine Fehleransicht umleiten, aber als allgemeine Praxis würde ich sagen, es ist besser, eine statische HTML-Seite zu haben.

Eigentlich denke ich, es gibt eine Erweiterung Anfrage für die Behandlung von globalen Ausnahmen. Have a look at this link...

+0

Dies funktioniert nicht für Eigenhosts, weil 'VirtualPathUtility' ein Teil von' System.Web' ist und IIS benötigt, um richtig zu arbeiten. –

+0

Sie sollten stattdessen verwenden: 'request.Uri.AbsoluteUri.Replace (request.Uri.PathAndQuery, request.PathBase +"/Home/Fehler ")' – tmoreira

+0

Wenn Sie Response.Redirect tun, wird es HTTP-Statuscode zu ändern 302. –

0

Ich stieß auf das gleiche Problem. Ich habe versucht, StatusCode und dann Redirect to 401 Seite. Aber Redirect ändert StatusCode auf 302.

Ich kam mit der Lösung von 401.html Schreiben auf Antwort. Es hat für mich funktioniert.

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 Kontext gibt Ihnen eine Option zum Umleiten. – Rajat

-1

owin bietet Ihnen eine Möglichkeit, Ihre Fehlerseite

context.Response.Redirect (errUrl) umgeleitet werden; // Kontext ist der owinContext

Sie benötigen keine spezielle RedirectResult- oder RedirectToAction-Methode.

+1

Das Problem dabei ist, dass Sie den Fehlercode 404 erst erhalten, wenn Sie die "nächste" Middleware aufgerufen haben. Das sendet einen Fehler an den Benutzer –

Verwandte Themen