7

Agrego ASP.NET MVC a una aplicación existente de WebForms. Por el momento, no me importa la autenticación/inicio de sesión, ya que esta parte es manejada por código existente (autenticación de formularios).Autorización basada en permisos en ASP.NET MVC3

En la aplicación WebForms existente, tenemos una autorización basada en permisos totalmente personalizada por página. De modo que cada usuario tiene un conjunto de derechos que enumera las páginas a las que tiene acceso.
Ahora necesito decidir cómo puedo usar el mismo sistema de permisos para restringir el acceso a controladores y acciones de MVC específicos.

Según tengo entendido, para ASP.NET MVC hay un estándar AuthorizeAttribute donde puedo especificar roles. También encontré algunos artículos que sugieren que especifican los permisos en lugar de papeles - entonces es posible hacer algo como esto:

[CustomAuthorize(Roles = "View products, Edit products")] 

Al extender AuthorizeAttribute, también puedo definir cómo almaceno y permisos de acceso.

Esta solución sería aceptable para mí (aunque el cambio de la semántica de los roles huele un poco).
Pero antes de comprometerme con ella, me gustaría ver qué otras opciones hay. Y ahí es donde estoy atascado: no he encontrado una descripción completa de los diferentes enfoques sobre la autorización en ASP.NET MVC. También me gustaría saber cómo todos los conceptos de seguridad (como Autenticación de formularios, Proveedores de membresía, Atributo de autorización, IPrincipal, etc.) están relacionados entre sí y cómo se supone que deben funcionar juntos.

+0

Esto es similar a lo que se intentó aquí: http://stackoverflow.com/questions/10338734/custom-security-scenario-in-asp-net-mvc/ – antijon

+0

@antijon por lo que yo entiendo, es similar a implementando un CustomizeAttribute personalizado. Pero me gustaría obtener más información sobre otras opciones y sus pros y contras. –

Respuesta

7

Lo primero que debes entender es que, al igual que en Webforms, hay una tubería en MVC. Cada solicitud pasa por una serie de métodos, y hay puntos de extensión a lo largo del camino que pueden "engancharse" y hacer cosas.

Todo lo que hace AuthorizeAttribute es enganchar en el punto de extensión OnAuthorization y decidir si se debe dar acceso a alguien o no según los criterios que le haya proporcionado (nombres de usuario, roles, etc.).

He aquí un ejemplo: http://geekswithblogs.net/brians/archive/2010/07/08/implementing-a-custom-asp.net-mvc-authorization-filter.aspx

Usted puede crear su propio atributo de autorización personalizado, y hacer exactamente lo mismo con sus propios criterios. No necesita volver a diseñar el parámetro Roles, puede crearlo solo si lo desea.

Este es el método que prefiere MVC. Otra cosa agradable es que si también lo convierte en un filtro, puede agregarlo a los filtros globales y hacer que se aplique a todo si lo desea.

Básicamente tiene otras dos opciones razonables. Implemente un controlador en global.asax en Application_AuthenticateRequest (no recomendado) o cree un BaseController común que anule OnAuthorize (el atributo engancha lo mismo, pero en un lugar diferente).

Muchas personas intentan hacer autenticación usando variables de Sesión, y eso es lo peor que se puede hacer.

Dado que no sabemos nada sobre su sistema de autenticación y permisos, todo lo que podemos hacer es proporcionar asesoramiento general.

+0

¡Gracias por su respuesta!En lo que respecta a la autenticación, es solo un nombre de usuario/contraseña de inicio de sesión a través de Forms Auth y el uso de una clase de usuario personalizada. En lo que respecta al sistema de permisos, para cada página definimos una "clave de módulo" y almacenamos los permisos de la base de datos para que cada usuario acceda a cada página. La comprobación de los derechos se implementa actualmente en 'BasePage: Página'. No estoy seguro de si esa es la información que le gustaría saber? –