2009-06-03 10 views
5

deseo de bloquear el acceso a la página de edición de un usuario (por ejemplo. /user/pure.krome/edit) si¿Cómo restrinjo el acceso a ciertas páginas en ASP.NET MVC?

a) Identity.IsAuthenticated = false

o se autentican pero

b) Idenitity.Name! = nombre de usuario de la página de usuario que intentan editar
c) Identity.UserType()! = UserType.Administrator // Esto es como un Rol, sin utilizar RoleProviders.

Supongo que puede decorar un controlador o el método de acción de un controlador con algo (s), pero no estoy seguro de qué?

Respuesta

3

Un atributo personalizado derivado de AuthorizeAttribute es lo que uso para hacer esto. Reemplace el método OnAuthorize e implemente su propia lógica.

public class OnlyUserAuthorizedAttribute : AuthorizeAttribute 
{ 
    public override void OnAuthorize(AuthorizationContext filterContext) 
    { 
     if (!filterContext.HttpContext.User.Identity.IsAuthenticated) 
     { 
      filterContext.Result = new HttpUnauthorizeResult(); 
     } 
     ... 
    } 
} 
+0

Interesante ... pero ... sé que necesito sustituir mi propia lógica, por la tuya. Pero su código solo responde la parte (a). También puedo verificar (c). Pero no tengo idea de cómo el código podría saber qué verificar (b). Tengo el Identity.Name ... pero, ¿cómo sabe este atributo, en ese momento, cuáles son los datos de visualización? o cualquier dato en el método de acción (que supongo que aún no se ha ejecutado ... porque los atributos se manejan primero. –

+0

El parámetro AuthorizationContext incluye referencias al Controlador, HttpContext, ResultContext, RouteData y Result. capaz de obtener todo lo que necesita de RouteData. Para generalizar, agregue una propiedad a su atributo que le permita especificar la clave de datos de ruta que usará para el nombre del usuario. Deberá hacer las cosas de DB para verificar el tipo de usuario de forma independiente Quizás desee tener dos constructores: uno que tome su interfaz de contexto/capa de base de datos y otro que no tome parámetros y cree el contexto/capa de la base de datos predeterminada. Use el anterior en la prueba de unidades. – tvanfosson

2

que implementaron las siguientes ActionFilterAttribute y funciona para manejar la autenticación y roles. Estoy almacenando papeles en mis propias tablas de BD así:

  • usuario
  • UserRole (contiene ID de usuario y las claves externas RoleID)
  • papel
public class CheckRoleAttribute : ActionFilterAttribute 
{ 
    public string[] AllowedRoles { get; set; } 


    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     string userName = filterContext.HttpContext.User.Identity.Name; 

     if (filterContext.HttpContext.User.Identity.IsAuthenticated) 
     { 
      if (AllowedRoles.Count() > 0) 
      { 
       IUserRepository userRepository = new UserRepository(); 
       User user = userRepository.GetUser(userName); 
       bool userAuthorized = false; 
       foreach (Role userRole in user.Roles) 
       { 
        userAuthorized = false; 
        foreach (string allowedRole in AllowedRoles) 
        { 
         if (userRole.Name == allowedRole) 
         { 
          userAuthorized = true; 
          break; 
         } 
        } 
       } 
       if (userAuthorized == false) 
       { 
        filterContext.HttpContext.Response.Redirect("/Account/AccessViolation", true); 
       } 
      } 
      else 
      { 
       filterContext.HttpContext.Response.Redirect("/Account/AccessViolation", true); 
      } 
     } 
     else 
     { 
      filterContext.HttpContext.Response.Redirect(FormsAuthentication.LoginUrl + String.Format("?ReturnUrl={0}", filterContext.HttpContext.Request.Url.AbsolutePath), true); 
     } 


    } 

Yo llamo a esto como esto ...

[CheckRole(AllowedRoles = new string[] { "admin" })] 
    public ActionResult Delete(int id) 
    { 
     //delete logic here 
    } 
+0

En mi primera línea anterior quise decir "* autenticación * y roles" – mikerennick

+0

Mikerennick, ¿hace algún almacenamiento en memoria caché de usuarios o roles? –

+0

No estoy usando el almacenamiento en caché, pero no veo ninguna razón por la cual la lista de los roles asignados a un usuario no se pueden almacenar en caché. Puede actualizar la memoria caché cuando se realizan cambios en las funciones asignadas. El código anterior no tiene ninguna relación con el almacenamiento en caché de los usuarios, ya que simplemente estoy buscando httpcontext para el usuario actual. También debo mencionar que agregar un cheque para los usuarios permitidos es, en principio, igual que el control de los roles permitidos. – mikerennick

Cuestiones relacionadas