2011-06-07 9 views
11

Quiero agregar una funcionalidad a la aplicación de manera que solo el administrador pueda crear usuarios y pueda proporcionar acceso al usuario a determinadas páginas.Gestión de roles en MVC3

Él puede crear funciones y puede proporcionar a los usuarios diferentes roles.

Estoy usando Visual Studio 2010 y compilando esta aplicación en MVC3.

Por favor, dame sugerencias para hacer sobre él.

Gracias de antemano.

Respuesta

4

Hace una pregunta muy amplia y le tomará un tiempo revisar todos sus requisitos. En cualquier caso, puede comenzar agregando una propiedad de usuario a un controlador del que todos los demás controladores heredan. Luego, puede interrogar a esa instancia de usuario para determinar si tienen acceso a la ruta actual. Esta solución debería brindarle la base que necesita para agregar algunas vistas administrativas para los requisitos de su negocio.

public class MegaController 
{ 
    protected User CurrentUser { get; set; } 

    protected override void Initialize(RequestContext context) 
    { 
     if (requestContext.HttpContext.User.Identity.IsAuthenticated) 
     { 
      var userRepository = new UserRepository(); 
      CurrentUser = userRepository.GetUser(
       requestContext.HttpContext.User.Identity.Name); 
     } 
    } 
} 

Los User y UserRepository tipos pueden ser su propio diseño. Podría usar LINQ To Entities para envolver una tabla llamada "User" y luego dentro de sus controladores, podría tener acceso a cualquier campo en esa tabla.

Entonces, subclase todos los controladores de MegaController

public class AdminController : MegaController 
{ 
    public ActionResult Action1() 
    { 
     return View(); 
    } 
} 

public class SomeOtherController : MegaController 
{ 
    public ActionResult Action1() 
    { 
     return View(); 
    } 
} 

Ahora, esto no resuelve completamente el problema "admin". Para hacerlo, puede incluir lógica en MegaController.Initialize() para interrogar la información de solicitud. Una vez que tenga la ruta solicitada y usuario en el contexto, el código podría tomar una decisión si se permite la solicitud, redirigirlo, etc.

protected override void Initialize(RequestContext context) 
{ 
    // ... 
    if(context.HttpContext != null) 
    { 
     if(context.HttpContext.Request.Path == "some/restricted/route" 
      && CurrentUser.Role != "Admin") 
     { 
      // or similar error page 
      var url = Url.Action("UnAuthorized", "Error"); 
      context.HttpContext.Response.Redirect(url); 
     } 
    } 
} 

Una advertencia con este método es que los nuevos controladores añaden a su aplicación haría tiene que heredar de MegaController, una arquitectura que los desarrolladores futuros podrían perder fácilmente en el proyecto.

+0

hay algún tutorial que pueda guiarme en esto. – kapil

+0

@kapil No he intentado recomendar ninguna documentación sin requisitos adicionales. ¿Puedes elaborar en tu publicación original? –

13

1.Decorate su creación del usuario y las acciones con opción de permiso de atributo Autorizar (Notificar, que el uso de las funciones de propiedad de AuthorizeAttribute requiere la implementación de MembershipProvider (standart o personalizado) y registrarlo en web.config)

public class AccountController : Controller 
{ 
[HttpGet, Authorize(Roles = "Admin")] 
public ViewResult CreateUser() 
{ 
    return View(); 
} 

[HttpPost, Authorize(Roles = "Admin")] 
public ActionResult CreateUser() 
{ 
    //... call service method to create user 
} 

[HttpPost, Authorize(Roles = "Admin")] 
public ActionResult AssignPageToUser(int userId, string controllerName, string ActionName) 
{ 
    //... insert record into table (UserPermissions) with attributes (userId, actionName, controllerName) 
    } 
// other methods without decoration by authorize attribute 
} 

Los siguientes párrafos son correctos si realmente desea tener control total sobre los permisos de acción por separado para cada usuario. Si cree que sus permisos pueden agruparse en un número finito y pequeño en roles, puede decorar todas las acciones/controladores mediante el atributo authorize y especificar roles, para qué acción/controlador está disponible: [Authorize("Customer, Manager, RegionalAdmin")] y otorgar la posibilidad de administrador para asignar roles a los usuarios. Pero recuerde que eso es suficiente para estar en solo 1 de los roles enumerados para obtener acceso, no puede requerir este atributo, por ejemplo, Administrador y Roles de administrador. Si desea requerir necesariamente más de 1 papel, utiliza varios atributos:

public class MyController:Controller 
{ 
[Authorize(Roles = "Manager")] 
[Authorize(Roles = "Admin")] 
public ActionResult Action1() 
{ 
//... 
} 
} 

2. Para sus páginas puede crear su propio atributo de filtro, heredado de atributo Autorizar, que comprobará si la acción está disponible para usuario (creo que quiere asignar acciones pero no vistas al usuario).

public UserPermissionRequiredAttribute: AuthorizeAttribute 
{ 
public OnAuthorization(AuthorizationContext filterContext) 
{ 
var isAuthenticated = filterContext.HttpContext.User.Identity.IsAuthenticated; 
var userName = filterContext.HttpContext.User.Identity.Name; 
var actionName = filterContext.ActionDescriptior.ActionName; 
var controllerName = filterContext.ActionDescriptior.ControllerDescriptor.ControllerName; 
    if (isAuthenticated && myUserActionPermissionsService.UserCanAccessAction(userName, actionName, contollerName) 
{ 
filterContext.Result = HttpUnauthorizedResult(); // aborts action executing 
} 
} 
} 

acciones 3.Decorate (controladores), que accesible para los usuarios otorgadas por admin:

MySpecialController: Controller 
{ 
[UserPermissionRequired] 
Action1() 
{ 
//... 
} 

[UserPermissionRequired] 
Action2() 
{ 
//... 
} 

Action3() 
{ 
//... 
} 

}

No recomiendo utilizar controlador base para ese fin, porque atributo el uso es más flexible (tiene control en el nivel de acción/controlador en lugar de solo el nivel de controlador), es una mejor manera de implementar responsabilidades separadas. El controlador base y el uso del atributo de filtro se correlacionan como polimorfismo y operador de conmutador.

2

Lea sobre plain old formas de autenticación para agregar soporte para roles y administración de usuarios.

Luego use [Authorize(Roles="RoleName1")] en controladores o acciones para controlar el acceso.

1

Verificar MvcMembership, también disponible en Nuget. Tendrá todos los elementos básicos para la administración de usuarios en un sitio ASP.NET MVC 3.

Necesitará un usuario/proveedor de roles. Lee this tutorial para aprender a configurar una base de datos que contendrá a tus usuarios y roles. Una vez que esté configurado, tendrá todos los procedimientos almacenados necesarios para la primera configuración/prueba manual creada.