2015-04-16 12 views
5

Sto utilizzando Owin per ospitare i controller WebAPI. Ho Owin middleware che esegue l'autenticazione e stabilisce quanto segue se l'autenticazione fallisce:Pagina di errore personalizzata quando si utilizza Owin

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

Quando questo accade Voglio visualizzare una pagina HTML con alcune istruzioni per l'utente. (Ad esempio, "È necessario accedere.")

Al momento sto reindirizzando l'utente a una pagina accessdenied.html, ma preferirei se l'accesso negato sia stato mostrato direttamente senza che l'utente venga reindirizzato (Non voglio che il campo Posizione nel browser Web cambi).

Suppongo di poter generare l'HTML al volo e aggiungerlo alla risposta, ad esempio leggendo il contenuto HTML da una risorsa.

La mia domanda è: è possibile visualizzare automaticamente una pagina di errore di accesso negata utilizzando la configurazione? In ASP.NET "Traditioinal", è stato possibile istituire customErrors nel web.config, ma questo non sembra funzionare con Owin SelfHost:

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

risposta

3

In un precedente mio progetto ho dovuto usare un Owin middleware come questo:

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

devi registrare il middleware prima di tutti gli altri.

In questo caso sto reindirizzando l'utente a una vista Errore, ma come pratica generale direi che è meglio avere una pagina statica HTML.

In realtà penso ci sia una richiesta di estensione per la gestione di eccezioni globali. Have a look at this link...

+0

Questo non funzionerà per gli host autonomi, perché 'VirtualPathUtility' è una parte di' System.Web' e richiede che IIS funzioni correttamente. –

+0

Dovresti invece usare: 'request.Uri.AbsoluteUri.Replace (request.Uri.PathAndQuery, request.PathBase +"/Home/Error ")' – tmoreira

+0

Se si esegue Response.Redirect, cambierà il codice di stato HTTP in 302. –

0

Mi sono imbattuto nello stesso problema. Ho provato a impostare StatusCode e quindi a reindirizzare a 401 pagina. Ma Redirect cambia StatusCode a 302.

Mi è venuta in mente una soluzione di lettura 401.html scrivendolo a Response. Ha funzionato per me.

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

Il contesto di owin ti offre un'opzione per il reindirizzamento. – Rajat

-1

Owin vi dà la possibilità di reindirizzare alla tua pagina di errore

context.Response.Redirect (errUrl); // context is the owinContext

Non è necessario disporre di alcun metodo speciale RedirectResult o RedirectToAction.

+1

Il problema con questo è che si ottiene il codice di errore 404 solo dopo aver richiamato il middleware "successivo". che invia un errore all'utente –