2012-03-20 20 views
6

Me preguntaba si es posible deshabilitar/anular todos los atributos de autorización.Anular/Deshabilitar autorización en ASP.NET MVC 3

En la máquina de desarrollo, la organización de Active Directory es completamente diferente de la del entorno de producción. Cuando desarrollo/pruebo el entorno de desarrollo, tengo que "eliminar" todos los atributos de autorización.

Se usan diferentes tipos de grupos de directorios activos (en Autorizar atributo) en los métodos de acción del controlador.

[Authorize] 
... 

[Authorize(Roles="domain\HR")] 
... 

[Authorize(Roles="domain\IT")] 
... 

Gracias de antemano ..

Respuesta

10

yo haría lo siguiente:

  1. escribir los atributos de autorización personalizado que funcionará por defecto en la versión y deje siempre que la acción de depuración, es decir

    public class MyAuthorizeAttribute: AuthorizeAttribute 
    { 
        protected override bool AuthorizeCore(HttpContextBase httpContext) 
        { 
         #if DEBUG 
         return true; 
         #else 
         return base.AuthorizeCore(httpContext); 
         #endif 
        } 
    } 
    
  2. Reemplazar todas las existentes Authorize atributos en código con su propia, es decir,

    [MyAuthorize] 
    ... 
    
    [MyAuthorize(Roles="domain\HR")] 
    ... 
    
    [MyAuthorize(Roles="domain\IT")] 
    ... 
    
  3. siempre se desarrollan en modo de depuración y publicar en modo de lanzamiento

Si no desea estar obligado a depurar cosa/liberación que pueda especifique su propio símbolo de compilación condicional en la configuración del proyecto; por ejemplo, DEVTEST y reemplace DEBUG con DEVTEST en el código del paso 1.

+0

¡Gracias! Es justo lo que estoy buscando ... –

+0

Hola, no puedo editarlo porque solo tiene 1 carácter, pero la clase base está mal escrita (AuthrorizeAttribute, hay una 'r' después de la 'h') y el código no lo hace funciona correctamente como es ahora. Saludos – Jaime

+1

@Jaime: ¡Gracias por detectar! Corregido –

0

En lugar de anular la AuthorizeAttribute ¿ha considerado implementar su propio? Puede crear su atributo y manejar la lógica para la validación.

Algo similar a esto:

public class AuthorizeRolesAttribute : ActionFilterAttribute 
{ 
    public UserProfileRole[] Roles { get; set; } 

    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
    var profile = ((ETMembershipUser)Membership.GetUser()).Profile; 
    if (profile != null) 
    { 
     foreach (UserProfileRole role in Roles) 
     { 
     if (role == profile.Role) 
      return; 
     } 
    } 
    //throw new SecurityException("You can not access this page"); 
    RouteValueDictionary redirectTargetDictionary = new RouteValueDictionary(); 
    redirectTargetDictionary.Add("action", "Index"); 
    redirectTargetDictionary.Add("controller", "Home"); 
    filterContext.Result = new RedirectToRouteResult(redirectTargetDictionary); 
    } 
} 
+2

-1 para muy mala idea: implementar el atributo de autorizar personalizado al NO derivar de AuthorizationAttribute – archil

+0

existente ¿por qué es una muy mala idea? – MikeSW

+1

@MikeSW, porque cuando no se deriva de AuthorizeAttribute, no implementa la interfaz 'IAuthorizationFilter'. Y cuando no lo haces, el orden de ejecución de tus filtros es diferente. Por ejemplo, la carpeta de modelo se ejecutará ** antes ** de su 'filtro de pseudo autorización '(lo llamo pseudo porque no implementó la interfaz adecuada, por lo que no es un filtro de autorización real). No iría tan lejos como Archil y rechazaría su pregunta, pero estoy completamente de acuerdo con él en que este es un diseño muy malo. –