11

Hay muchas preguntas (e información) sobre la configuración de miembros de asp.net, proveedores de funciones y similares. Independientemente de si debe usar la plataforma integrada proporcionada por microsoft, o ampliar las clases base y el rol propio.Cómo gestionar mejor los permisos (no roles) en la membresía de asp.net, específicamente en ASP.NET MVC

He decidido extender los proveedores predeterminados e implementar mi propia membresía y proveedores de roles. Ahora mi pregunta es específicamente sobre la autenticación de roles.

Tradicionalmente, crearía roles como 'Administrador, Administrador, Empleado, Superusuario' o lo que sea que tenga. Pero, ¿qué haría/debería hacer con respecto a los permisos que considero que son un control más fino? Permítanme elaborar ...

Dentro de mi sitio asp.net mvc tengo diferentes áreas como administración, administración, mensajería, informes, etc. Me gustaría crate roles para cada uno de estos como 'Administrador', 'Administrador', ' Reportero, etc. Sin la función adecuada, no puede obtener acceso a esa área del sitio. Así que bloquearía todos los controladores con esto en el nivel de clase.

Pero ahora tome un área como ejemplo; mensajes, y dicen que quería tener permisos de grano más finos para CRUD; crear un mensaje, ver/leer mensajes, editar mensajes, eliminar mensajes, etc.

Finalmente mi pregunta. ¿Cómo sería mejor implementar este grano de control más fino? Un enfoque que veo (no estoy seguro de si es bueno) es simplemente crear roles de membresía asp.net para todo. Así que podría tener ....

Messenger (rol de nivel amplio), CreateMessage, ReadMessage, EditMessage, DeleteMessage.

Por un lado, me gustaría que algunos usuarios puedan leer/ver mensajes. Pero no necesariamente los crea o borra. Las acciones individuales del controlador podrían tener los roles específicos aplicados.

¿Ve algún problema con este enfoque? Tienes una mejor idea?

Solución hasta ahora

he decidido crear mi propio esquema e implementar suscripciones personalizado y proveedores de papel. Mi esquema incluye;

  • usuario
  • PerfilUsuario
  • Permiso
  • PermissionAssignment
  • papel
  • RoleAssignment

Yendo a estar fuera durante un día o dos, pero se actualizará con más información cuando Tengo una oportunidad.

Respuesta

5

Creo que debes olvidarte de los roles en el mecanismo de autorización, pide permisos en su lugar (al final un rol es una agrupación de permisos), así que si lo miras de esa manera, tu Authorize Atributo debería solicitar una entidad y acción, no para un rol particular. Algo así como:

[Authorize(Entities.Message, Actions.Create)] 
public ActionResult CreateMessage() 

[Authorize(Entities.Message, Actions.Edit)] 
public ActionResult EditMessage() 

[Authorize(Entities.Message, Actions.View)] 
public ActionResult ViewMessage() 

De esa manera sus funciones hacen lo que hacen mejor colección, permisos abstractos en lugar de determinar de manera inflexible del nivel de acceso.

EDIT: Manejar normas específicas como el señalado por David Robbins, no se permite el Administrador de A a eliminar los mensajes creados por el Administrador de B, suponiendo que ambos tienen el permiso necesario para acceder a este controlador de Acción, el Autorizar no es responsable de comprobar este tipo de reglas, e incluso si intentas comprobar que en el nivel del Filtro de Acción va a ser un problema, entonces lo que puedes hacer es extender la validación de Autorizar a la AcciónResultado (inyectando un parámetro de acción que contiene el resultado de validación), y deje que ActionResult tome la decisión lógica allí con todos los argumentos en su lugar.

This es una pregunta similar, no es exactamente el caso señalado aquí, pero es un buen punto de partida para ampliar la validación de autorizar con los parámetros de acción.

+0

¿Es posible llevar eso un poco más allá y decir no solo "se permite esta acción?" pero decir "¿se permite esta acción en esta entidad en particular?" p.ej. la situación ¿David Robbins señala que el administrador A no puede eliminar los mensajes creados por el administrador B? –

+0

ese escenario particular puede ser manejado por la Acción, pero la lógica real de Authorize y ActionResult cambiará un poco, un queston relacionado anterior mostrará cómo puede archivar eso, http: //stackoverflow.com/questions/2872588/asp- net-mvc-authorization-permission-to-use-model-classes/2878159 # 2878159 – JOBG

+0

Gracias Omar, he estado trabajando un poco más en esto y lo actualizaré cuando tenga más información acerca de dónde estoy. Aclamaciones. –

-1

Además de agregar [Authorize(Roles="Administrator")] etc. arriba de su controlador. También puede poner ese atributo en las acciones individuales también

+0

De hecho, mencioné esto en mi pregunta. "... Las acciones del controlador individual pueden tener los roles específicos aplicados". –

2

Con respecto a su ejemplo CRUD, ¿no está realmente hablando de autorización, y la autorización podría variar entre los roles de miembros "Administrador" y "Reportero"?Creo que es necesario crear un mecanismo separado para esas actividades de grano más fino si los roles no distinguen entre una autorización de lectura y escritura entre los mensajes.

Si creara un rol para cada acción - EditMessage, DeleteMessage - ¿qué haría en caso de que el Administrador A NO deba eliminar mensajes para el Administrador B?

+0

Hola David, Gracias por su contribución. "Creo que debe crear un mecanismo separado para aquellas actividades de grano más fino si los roles no distinguen entre una autorización de lectura y escritura entre mensajes". Bueno, esto es exactamente lo que me pregunto. En cuanto a su escenario ... no estoy seguro. Buen punto sin embargo. No * pienso * que será un problema. Principalmente estoy pensando que un gerente de nivel superior tendrá acceso completo a un área del sitio, mientras que podrían dar acceso parcial (¿solo lectura?) A un empleado bajo ellos, etc. Comparado con los roles generales, no he los permisos vistos discutieron mucho. –

+0

Me encontré con el mismo escenario el año pasado en un proyecto donde tenía roles como AgentManager y Agent, pero la regla de autorización de que solo el agente David Robbins podía ver los registros de David Robbins, mientras que AgentManager solo puede ver sus informes directos. Resolví el problema con algunas tablas en SQL para representar las relaciones entre Agentes y Agentes Gestores y sus respectivos registros. –

Cuestiones relacionadas