2009-09-14 15 views
10

Tengo un controlador con un atributo Autorizar la siguiente manera:¿Cómo visualizo una página de error personalizada para un resultado Http 401?

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

y mi web.config ha customErrors establecido como el siguiente:

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

Cuando trato de invocar una acción en el controlador principal usando un rol no autorizado, simplemente obtengo una página en blanco. No me redirigen a la página personalizada. Alguna idea?

Respuesta

0

Un enfoque estándar en lo que sé es tener un controlador simple error que maneja las peticiones de entrada y salida a la vista apropiada dependiendo de la httpStatus código fue devuelto ... algo como esto:

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

y a continuación, especifique una acción de redirección en su webconfig:

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

Tome un vistazo a tvanfosson 's Answer de this very similar question, Esto es lo que estoy haciendo (Gracias a tvanfosson), por lo que ahora sólo tengo que decir:

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

Si el usuario no está en la función, obtendrán la vista especificada por ViewName.

Nota: la página en blanco proviene de Cassini, si se mueve la aplicación a un servidor IIS real verá el 401.

+0

que quiere decir si muevo la aplicación a IIS que debería ver el ¿pagina personalizada? o simplemente debería ver la página estándar IIS 401? –

+0

Verá el 401. –

9

aprecio a esta pregunta es un poco viejo, pero esto puede ayudar a alguien .

Para un 401 probablemente verá la página 401 no autorizada estándar, incluso si ha agregado 401 a la sección de clientes en su web.config. Leí que al usar IIS y Autenticación de Windows la verificación ocurre antes de que ASP.NET siquiera vea la solicitud, por lo tanto, ves la página en blanco en Cassini y en IIS es la propia 401.

Para mi proyecto, edité el archivo Global.asax para redirigir a una ruta que había creado para 401 errores, enviando al usuario a la vista "No autorizado para ver esto".

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

y en el Route.config:

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

y en el controlador:

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

También puede crear su propio el atributo de autorización personalizada y establece su propia ruta para redirigir a los usuarios en y nuestra página

Aquí una muestra de mi proyecto:

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

y se agrega a su "bandera" en el controlador de acción como esta

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