2009-09-14 20 views
10

Ho un controller con un Autorizzare attributo come questo:Come si visualizza una pagina di errore personalizzata per un risultato Http 401?

[Authorize(Roles = "Viewer")] 
public class HomeController : Controller 
{ 
    //... 
} 

e il mio web.config ha customErrors impostato come la seguente:

<customErrors mode="On"> 
     <error statusCode="401" redirect="notauthorized.html"/> 
    </customErrors> 

Quando provo a richiamare un'azione sul controller casa utilizzando un ruolo non autorizzato, ottengo solo una pagina vuota. Non vengo reindirizzato alla pagina personalizzata. Qualche idea?

risposta

0

Un approccio standard per quanto ne so è di avere un semplice controllo di errore che gestisce le richieste in entrata ed emette la visualizzazione appropriata a seconda di quale httpStatus codice restituito ... qualcosa di simile:

public class ErrorController : Controller 
{ 

    [AcceptVerbs(HttpVerbs.Get)] 
    public ViewResult Index() 
    { 

     //Check if the statuscode is HttpStatusCode.NotFound; 
     if(Response.StatusCode == 401) 
      return View("NotAuthorised"); 
     return View(); 
    } 
} 

e quindi specificare un'azione di reindirizzamento in WebConfig:

<customErrors mode="On" defaultRedirect="~/Error" /> 
3

Date un'occhiata a tvanfosson s' Answer da this very similar question, questo è quello che sto facendo (Grazie a tvanfosson), così ora non mi resta che dire:

[MyAuthorize(Roles="SuperAdmin",ViewName="AccessDenied")] 
public class SuperAdminController : Controller 
... 

Se l'utente non è nel ruolo, visualizzerà la vista specificata da ViewName.

Nota: la pagina vuota è venuta da Cassini, se si sposta l'applicazione a un server IIS reale si vedrà il 401.

+0

dire se mi trasferisco l'applicazione per IIS dovrei vedere il pagina personalizzata? o dovrei solo vedere la pagina standard di IIS 401? –

+0

Vedrete il 401. –

9

mi rendo conto questa domanda è un po 'vecchio, ma questo potrebbe aiutare qualcuno .

Per un 401 probabilmente vedrete la pagina 401 non autorizzata standard, anche se avete aggiunto 401 alla sezione customerrors nel vostro web.config. Ho letto che quando si utilizza IIS e Windows il controllo avviene prima che ASP.NET veda la richiesta, quindi si veda la pagina vuota su Cassini e su IIS è proprio 401.

Per il mio progetto ho modificato il file Global.asax per reindirizzare a un percorso che avevo creato per errori 401, inviando l'utente alla vista "Non autorizzato per vedere questo".

Nella Global.asax:

void Application_EndRequest(object sender, System.EventArgs e) 
    { 
     // If the user is not authorised to see this page or access this function, send them to the error page. 
     if (Response.StatusCode == 401) 
     { 
      Response.ClearContent(); 
      Response.RedirectToRoute("ErrorHandler", (RouteTable.Routes["ErrorHandler"] as Route).Defaults); 
     } 
    } 

e nel Route.config:

 routes.MapRoute(
     "ErrorHandler", 
     "Error/{action}/{errMsg}", 
     new { controller = "Error", action = "Unauthorised", errMsg = UrlParameter.Optional } 
     ); 

e nel controller:

public ViewResult Unauthorised() 
    { 
     //Response.StatusCode = 401; // Do not set this or else you get a redirect loop 
     return View(); 
    } 
0

Inoltre è possibile creare il proprio attributo di autorizzazione personalizzato e impostare il proprio percorso per reindirizzare gli utenti su y la nostra pagina

Ecco un esempio sul mio progetto:

/*../controllers/CustomAuthorizationAttribute.cs */ 
public class CustomAuthorizationAttribute : FilterAttribute, IAuthorizationFilter 
{ 
    void IAuthorizationFilter.OnAuthorization(AuthorizationContext filterContext) 
    { 
     string session = filterContext.HttpContext.Session["id"] != null ? filterContext.HttpContext.Session["id"].ToString() : null; 
     if (string.IsNullOrEmpty(session)) 
     { 
      // Unauthorized! 
      filterContext.Result = new RedirectToRouteResult(
       new RouteValueDictionary 
       { 
        { "action", "Create" }, { "controller", "Sessions" } 
        //,{ "parameterName", "YourParameterValue" } 
       } 
      ); 
     } 
    } 
} 

e si aggiunge il "flag" nel controllore azione come questo

/*../controllers/ReportsController.cs */ 
public class ReportsController : Controller 
{ 
    [CustomAuthorizationAttribute] 
    public ActionResult Index() 
    { 
     //do something 
    } 
} 
Problemi correlati