2011-04-01 6 views
7

Tengo una aplicación MVC con el siguiente bloque en el interior de Web.config:C# MVC: ¿Cómo anular la redirección de autenticación configurada?

<authentication mode="Forms"> 
    <forms loginUrl="~/Login" timeout="2880" /> 
</authentication> 

lo tanto, si un usuario solicita una página y no la autorización, que serán redirigidos a ~/Inicio de sesión.

Eso está bien, y lo necesito para la mayoría de mis controladores. Sin embargo, tengo un controlador con el que me gustaría pasar esta regla. ¿Cómo puedo permitir que los controladores específicos ignoren esta regla?

Mi problema es que en mi aplicación MVC (que tiene varios controladores), tengo un controlador determinado que aloja una interfaz REST (no para uso del navegador). Como este controlador no es para consumo de navegador, no quiero que devuelva una página de inicio de sesión completa (o cualquier página en realidad, solo cadenas o vistas parciales).

Tenga en cuenta que estoy usando personalización [Autorizar ...] atributos en mis acciones, y cuando ESTAS fallan, redirigen a una acción de Error - pero, desafortunadamente, mi acción de Error (que devuelve una cadena corta) se está redireccionando a la página de inicio de sesión debido a esto configuración de configuración!

Me estoy mareando al tratar de resolver esto, ¿qué estoy haciendo mal? Puedo proporcionar más detalles si es necesario.

+0

¿Está heredando de AuthorizeAttribute o implementating IAuthorizationFilter –

+0

Heredar de AuthorizeAttribute. –

Respuesta

11

Puede extender la clase AuthorizeAttribute y anular HandleUnauthorizedRequest, es posible que desee devolver un código de estado HTTP prohibido en lugar de un mensaje personalizado.

public class CustomAuthorizationAttribute : AuthorizeAttribute 
{ 
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
    { 
     // You need to set this action result to something other than a HttpUnauthorizedResult, 
     // this result will cause the redirection to the login page 

     // Forbidden request... does not redirect to login page 
     // filterContext.Result = new HttpStatusCodeResult(403); 

     filterContext.Result = new ErrorActionResult { ErrorMessage = "Unauthorized Access" }; 
    } 
} 

public class ErrorActionResult : ActionResult 
{ 
    public string ErrorMessage { get; set; } 

    public override void ExecuteResult(ControllerContext context) 
    { 
     context.HttpContext.Response.Write(this.ErrorMessage); 
    } 
} 
+0

Usted definió mi problema directamente: devolver un 401 no autorizado estaba causando que se redirija. Usar Forbidden parece una buena solución, aunque para ser honesto, preferiría que un usuario vea "No autorizado" en lugar de "Prohibido" en este caso. Pero solo usaré prohibido. –

2

Añada la siguiente después de su elemento system.web en Web.config:

<location path="home"> 
<system.web> 
    <authorization> 
     <allow users="*" /> 
    </authorization> 
</system.web> 
</location> 

Esto permitirá a los usuarios no autenticados acceso a "/ home" y por lo tanto cualquier acción en la HomeController.

+0

No me gusta la idea de poner esto en Web.config, ya que es algo que no quiero olvidar accidentalmente implementar o sobrescribir accidentalmente. Pero ese podría ser un buen enfoque en otras situaciones, gracias. –

Cuestiones relacionadas