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.
hay algún tutorial que pueda guiarme en esto. – kapil
@kapil No he intentado recomendar ninguna documentación sin requisitos adicionales. ¿Puedes elaborar en tu publicación original? –