2012-06-18 19 views
11

En mi aplicación asp.net mvc3, tengo un atributo de autorización personalizado como se ve a continuación.HandleUnauthorizedRequest no anula

public class CustomAuthorize : AuthorizeAttribute 
{ 
    public IAccountRepository AccountRepository { get; set; } 

    public CustomAuthorize() 
    { 
     this.AccountRepository = new UserModel(); 
    } 

    protected override bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     base.AuthorizeCore(httpContext); 
     return AccountRepository.isEnabled(HttpContext.Current.User.Identity.Name); 
    } 

    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
    { 
     base.HandleUnauthorizedRequest(filterContext); 
    } 
} 

que tienen la etiqueta [CustomAuthorize] en mis acciones del controlador, y el método AuthorizeCore funciona bien - que realiza la lógica que yo quiero que (asegurándose de que la cuenta está habilitada en realidad), y luego regresar como tal.

Sin embargo, el método HandleUnauthorizedRequest reemplazado, que como yo lo entiendo debería permitirme controlar el comportamiento de una solicitud no autorizada, no se está ejecutando en absoluto. Puse un punto de quiebre allí, puse código allí, acceso a mi aplicación no autorizada, y el código nunca se ejecuta.

¿Qué me estoy perdiendo?

EDIT: Hice algunas investigaciones más y encontré algunas otras personas que tenían este problema, pero desafortunadamente ninguna solución.

Edit2: Código de ejemplo

[CustomAuthorize] 
public class UserController: Controller 
{ 
    public UserController() 
    { 
     //do stuff here 
    } 
} 

Datos 3: @Fabio

Esto es lo que estoy tratando de hacer. Tengo una página de inicio de sesión (auth de formularios) que funciona bien: llama a mi inicio de sesión personalizado y luego llama mi anulación de AuthorizeCore. Mi aplicación utiliza una gran cantidad de llamadas ajax, y mi objetivo final es que cada vez que un usuario esté usando la aplicación y el administrador las desactive, al hacer una llamada ajax después de haber sido deshabilitado (aunque aún esté conectado) se cierre la sesión. Sin embargo, para hacer esto, quiero devolver una respuesta personalizada si el usuario está haciendo una llamada ajax, y para eso, tengo que reemplazar HandleUnauthorizedRequest. Pero mi Authorize Core (y, por extensión, HandleUnauthorizedRequest) se ignoran si el usuario está conectado (a pesar de que tengo customauthorize etiquetas en todas las acciones de mi controlador que está llamando el ajax).

En resumen: Quiero autorizar al usuario en cada petición, no sólo la solicitud de inicio de sesión (que parece ser lo que el proveedor de pertenencia está haciendo ahora)

+0

¿Tiene cualquier otro atributo que heredan de AuthorizeAttribute? ¿Tiene el AuthorizeAttribute establecido en el nivel de clase, o en una clase base? –

+0

Tengo un proveedor de membresía personalizado, esta clase se declara en el mismo archivo. No tengo otros atributos que hereden de AuthorizeAttribute hasta donde yo sé. – Mansfield

+0

¿Se ha interrumpido un punto de interrupción en AuthorizeCore, como se esperaba? –

Respuesta

6

Terminé cambiando mi enfoque un poco. Implementé la verificación de permisos individuales, y luego eso hizo que se llamara a AuthorizeCore cada vez (y no se almacenó en caché, lo que supongo que era lo que estaba sucediendo antes).

Curiosamente, poner un punto de interrupción en la anulación HandleUnauthorizedRequest aún no se rompe, pero ponerlo dentro del método lo hará. Extraño, y me sorprendió un poco, pero lo he resuelto ahora.

Código si alguien está interesado:

public class CustomAuthorize : AuthorizeAttribute 
{ 
    public string Permissions { get; set; } 

    private IAccountRepository AccountRepository { get; set; }   

    private string[] permArray { get; set; } 

    private string reqStatus { get; set; } 

    public CustomAuthorize() 
    { 
     this.AccountRepository = new UserModel(); 
    } 

    protected override bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     base.AuthorizeCore(httpContext); 

     if (Permissions != null) { 
      permArray = Permissions.Trim().Split(' '); 

      if (AccountRepository.isEnabled(httpContext.User.Identity.Name)) { 
       this.reqStatus = "permission"; 
       return AccountRepository.hasPermissions(permArray);      
      } else { 
       return false; 
      } 
     } else { 
      return AccountRepository.isEnabled(httpContext.User.Identity.Name); 
     } 
    } 

    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
    { 
     if (this.reqStatus == "permission") { 
      filterContext.Result = new RedirectResult(MvcApplication.eM.cause("no_permission", "redirect")); 
     } else { 
      base.HandleUnauthorizedRequest(filterContext); 
     } 
    } 
} 

Y entonces el controlador decorado con esto:

[CustomAuthorize(Permissions="test_perm")]

+0

EXACTAMENTE lo que necesitaba ver !!!! –

2

Ésta puede ser una respuesta/pregunta estúpida, pero es El método AccountRepository.isEnabled devuelve false para que se pueda ejecutar HandleUnauthorizedRequest?

Si es verdadero, no se ejecutará el método HandleUnauthorizedRequest.

+0

Creo que puede haber tropezado con algo. Parece que AuthorizeCore solo se está llamando si el usuario ya ha iniciado sesión. Por lo tanto, si cierro la sesión de la aplicación y navego a mi controlador, no ejecutará mi CustomizeCore personalizado, solo redirecciona automáticamente a la página de inicio de sesión. Ver mi próxima edición para mi OP. – Mansfield

Cuestiones relacionadas