2010-08-31 18 views
7

Resumen: Necesito autorizar páginas basadas en los datos presentes en la cadena de consulta de una url, no solo en el nombre de la página.Autorización basada en datos en ASP.NET


Antecedentes:

Digamos que estoy construyendo un sistema de inventario de la biblioteca. Los usuarios se pueden crear y asignar a una única biblioteca en una función de administrador o usuario. Hay cientos de bibliotecas competidoras en la misma base de datos, por lo que es importante asegurarse de que los usuarios de una biblioteca no puedan ver el inventario de otra biblioteca.

En este momento estoy usando una configuración de ASP.NET bastante estándar: Autenticación de formularios con SqlMembershipProvider. Autorización usando SqlRoleProvider, configurado a través de las secciones <authorization> en web.config. Ajuste de seguridad con el proveedor de SiteMap para ocultar páginas no autorizadas.

Para controlar el filtrado de la información de inventario, estoy verificando manualmente el ID de la biblioteca asociada de un usuario con cada consulta de inventario. Funciona, pero es tedioso y propenso a errores. Tiene que haber una mejor manera.

Pregunta:

Ahora los usuarios tienen la capacidad de crear "colecciones" arbitrarias dentro de una biblioteca. (por ejemplo, Collection A tiene los libros 1, 2, & 3). Los administradores desean la capacidad de otorgar acceso de administrador/usuario a colecciones individuales, no solo a la biblioteca completa.

Por lo tanto, si un usuario va a www.com/Book.aspx?BookId=1, el sistema necesita asegurarse de que el usuario tenga permisos para la colección en la que está el "Libro 1" antes de mostrar la página. Si van a www.com/Reviews.aspx?ReviewId=23, necesito asegurarme de que la revisión sea para un libro que está en una colección que tienen permiso para ver.

1) ¿Cómo puedo implementar esto de la manera más estándar ASP.NET posible?
¿Comprobación manual dentro de una página base?
¿Un HttpModule personalizado?
¿Un proveedor de funciones personalizado?
No estoy interesado en cómo almacenar los permisos de administrador/usuario, sino cómo/dónde autorizar en función de esos permisos. (ejemplos sobre cómo implementar cualquiera de los son apreciados)

2) Para complicar aún más que, todavía me gustaría recorte de seguridad para comprobar si el usuario tiene derechos de administrador en cualquier colección o biblioteca y ocultar el administrador páginas si no lo hace.

+0

+1 para formatear su pregunta tan increíblemente bien! – user279521

+0

@ user279521: Gracias :) – Greg

Respuesta

2

No manejaría esto en ningún lugar cerca de la capa UI (ASP.NET) sino dentro de los servicios de la aplicación. Algo así como:

  1. servicios de generación que se toman un IPrincipal (o su objeto de usuario personalizada) como un parámetro de constructor.
  2. Al solicitar un libro/reseña/lo que sea, el servicio es responsable de para verificar si el usuario tiene acceso al recurso .
  3. Si el usuario no tiene acceso, hacer algo predeterminado ( pasar un mensaje, una excepción, nula retorno).

Esto será mucho más comprobable y utilizable en el largo plazo y luego preocuparse por el lado de la interfaz de usuario de ASP.NET.

Si usted tiene que manejar en el lado ASP.NET, me gustaría considerar el uso de una costumbre y la costumbre IPrincipalRoleProvider para envolver cada biblioteca como una función de acceso, entonces se podría utilizar la mayor parte del LoginView, etc. controles.

+0

+1 Esos son puntos muy buenos. Si lanza una excepción, y me olvido de manejarlo en la interfaz de usuario, en el peor de los casos fallará en lugar de filtrar datos confidenciales (lo cual es bueno). – Greg

1

Normalmente, este tipo de cosas se manejan a nivel de datos. Tiene poco que ver con ASP.NET, además de lo último, necesita una identificación de usuario (que proviene de la membresía). Lo que hace es buscar alguna parte de su entidad sobre la que quiera controlar el acceso, luego crea todas sus consultas para filtrarla.

Por ejemplo, si realiza el acceso a nivel de biblioteca, a continuación, deberá añadir una asociación entre el usuario y la biblioteca. Esto puede ser 1: 1, 1: muchos, muchos: muchos, cualquiera que sea el modelo de datos que requiera. La clave es que la unión a través de este nivel siempre devolverá ningún registro, por lo tanto, toda su consulta no devolverá ningún registro.

ejemplo, suponiendo que un usuario sólo puede pertenecer a una biblioteca.

mesa usuario tiene LibraryID, mesa Libros tiene LibraryID, esto hace que una efectiva muchos-a-muchos se unen entre usuarios y Libros. Así que se une a User y Library en LibraryID, y se une a Library and Books en LibraryID, entonces solo los libros que pertenecen a una biblioteca con la que el usuario está asociado serán devueltos por la consulta.

De esta manera, se hace imposible para un usuario consultar cualquier cosa que no se asocian directamente con. La seguridad está completamente en la base de datos, y no se requiere lógica comercial.

Cuestiones relacionadas