Permisos / modelo / patrón correcto para la aplicación .NET

9

Necesito implementar flexible Y simple (si tal cosa existe) y al mismo tiempo utilizar medios integrados si es posible

Hasta ahora he implementado MembershipProvider y RoleProviders. Esto es genial, pero ¿a dónde voy después?

Siento que necesito agregar el término "Priviledge" y luego codificar aquellos dentro de la aplicación. Los usuarios configurarán roles para agregar Privilidges a Roles y asignar Roles a los usuarios.

¿Suena eso como un buen modelo? ¿Debería pensar en agregar privilegios a nivel de Usuario además de agregarlos a Roles? Podría pero imagino problemas con la configuración (confusa) y el siguiente soporte.

Si no hago eso y algunos usuarios específicos necesitarán privilegios menores, el administrador tendrá que crear otro rol, etc.

¿Alguna bala de plata para un sistema como este? ¿Y por qué Microsoft no fue más allá que solo los proveedores de Membresía y Rol?

Otra idea: deje los roles como titular de "privilegios" y codifíquelos. Entonces puedo codificar esos roles dentro de la aplicación usando todas las marcas / atributos disponibles, etc., todo Microsoft.

Agregue una nueva entidad "Grupo" y cree una relación como esta

  • Los usuarios
  • Grupos de Usuarios
  • Grupos
  • RoleGroups
  • Roles

De esta manera puedo recopilar roles en grupos y asignar esos grupos a los usuarios. Suena genial y coincide con otros patrones de software. Pero entonces realmente no puedo implementar cosas dentro de RoleProvider como:

  • AddUsersToRoles
  • RemoveUsersFromRoles

Y algunas cosas ya no tienen sentido porque estarán codificadas

  • DeleteRole
  • CreateRole
katit
fuente

Respuestas:

5

Si la autorización basada en roles no es lo suficientemente detallada para usted, considere usar la Autorización basada en reclamos .

Un reclamo describe un recurso y una actividad, algo así como una entrada en una ACL, pero más flexible, porque el "recurso" no tiene que ser un objeto físico, puede ser cualquier cosa que desee y puede contener cualquier información. usted quiere.

En este modelo, un reclamo es equivalente a lo que llama un "privilegio", y agrupa los reclamos en conjuntos de reclamos, que es más o menos equivalente a lo que llama un "rol". Todas estas API y más ya están en el System.IdentityModelespacio de nombres.

Por supuesto, usted menciona MembershipProvidery RoleProvidersi está tratando de incluir todo esto en el modelo de membresía ASP.NET (como implican esos nombres), simplemente olvídese. Si desea utilizar esas API de proveedor, debe hacerlo a su manera, y su forma no se vuelve más granular que el concepto de un rol.

En cambio, en ASP.NET, el concepto de "privilegio" está codificado en el nivel de acción u operación , donde usted declara qué roles tienen permitido ejecutar esa acción. Esto es realmente mucho más fácil de tratar en ASP.NET MVC, donde simplemente aplicas un [AuthorizeAttribute]controlador o acciones de controlador; en ASP.NET "de la vieja escuela", está manejando eventos, por lo que la autorización tiende a ser ad-hoc o a nivel de página (o ambos).

Aaronaught
fuente
Mucha gran información, gracias! La aplicación es en realidad la aplicación Silverlight con una porción del servidor expuesta como servicio RESTful WCF. Basado en reclamos parece interesante, pero no noté el concepto de usuario y la autorización dentro de él. Artículo interesante que acabo de encontrar: geekswithblogs.net/shahed/archive/2010/02/05/137795.aspx
katit
@katit: prácticamente toda la autenticación / autorización en .NET se basa en la interfaz IPrincipal . Si está haciendo una autorización basada en reclamos, entonces usa un IClaimsPrincipal para eso y lo envíaIPrincipal a IClaimsPrincipalcuando desea hacer verificaciones de reclamos. Estará escribiendo una gran cantidad de su propio código si desea encajarlo con (por ejemplo) Autenticación de formularios, pero obviamente se puede hacer (según el enlace).
Aaronaught
la pregunta es ... ¿Quizás es más fácil agregar otro nivel de "Grupo" a los proveedores de membresía / rol o escribir un proveedor propio?
Prácticamente la
3
@katit: últimas palabras famosas. No inventes la tuya a menos que tengas una muy buena razón para inventar la tuya ("parece más fácil" no es una buena razón; solo parece más fácil cuando no tienes experiencia directa y, por lo tanto, no tienes la capacidad de juzgar el cantidad de trabajo requerida).
Aaronaught