Estoy construyendo un CMS simple en el que los roles se configuran dinámicamente en el panel de administración. La forma existente de autorizar un método de controlador, agregando [Authorize(Roles="admin")]
por ejemplo, ya no es suficiente. La relación de rol y acción debe almacenarse en la base de datos, de modo que los usuarios finales puedan otorgar/recibir permisos hacia/desde otros en el panel de administración. ¿Cómo puedo implementar esto?ASP.NET MVC - Autorización dinámica
Respuesta
Eso es exactamente lo que hace el material de membresía/perfil de ASP.NET por usted. Y funciona con el atributo Autorizar.
Si desea enrollar el suyo, podría crear un filtro de acción personalizado que imite el comportamiento del filtro de acción Authorize estándar. Pseudo código a continuación.
public MyAuthorizeAttribute : ActionFilterAttribute
{
public string MyRole { get; set; }
public void OnActionExecuting(ControllerContext context)
{
if (!(bool)Session["userIsAuthenticated"])
{
throw new AuthenticationException("Must log in.");
}
if (!Session["userRoles"].Contains(MyRole))
{
throw new AuthenticationException("Must have role " + MyRole);
}
}
}
El papel - relación de acción debe ser almacena en la base de datos
Usted tendrá que comprobar su seguridad dentro del método de controlador, a menos que desee subclase AuthorizeAttribute
de modo que mira hacia arriba los roles de la base de datos para usted.
Si desea tomar el control del proceso de autorización, debe crear la subclase AuthorizeAttribute y anular el método AuthorizeCore. Luego simplemente decore sus controladores con su CmsAuthorizeAttribute
en lugar del predeterminado.
public class CmsAuthorizeAttribute : AuthorizeAttribute
{
public override virtual bool AuthorizeCore(HttpContextBase httpContext)
{
IPrincipal user = httpContext.User;
IIdentity identity = user.Identity;
if (!identity.IsAuthenticated) {
return false;
}
bool isAuthorized = true;
// TODO: perform custom authorization against the CMS
return isAuthorized;
}
}
La desventaja de esto es que usted no tendrá acceso a la COI ctor-inyectada, por lo que tendrá que solicitar cualquier dependencia del contenedor directamente.
¿cuál es la desventaja de obtener dependencias del contenedor directamente? Tuve que hacer esto para mi implementación de RoleProvider ... – Haroon
@Haroon - La desventaja es una de diseño. En general, se considera que es mejor práctica que el código permanezca ignorante del contenedor IoC para reducir sus dependencias (por ejemplo, es posible que desee reutilizar su código en WP7, donde generalmente se evita un contenedor basado en reflexión por motivos de rendimiento). –
@Haroon - Dicho esto, MVC 3 admite la inyección de atributos de filtro a través de propiedades decoradas por atributos. Todavía es necesario conocer el contenedor, pero se burla más fácilmente. –
- 1. ASP.NET MVC Autorización
- 2. ASP.NET MVC 3 personalizada Autorización
- 3. Autorización y ASP.NET MVC Caching
- 4. Autenticación/Autorización de ASP.NET MVC 3
- 5. ASP.Net MVC Autorización del filtro acción
- 6. las funciones de ASP.NET MVC autorización
- 7. ASP.NET MVC Autorización basada en Route Params
- 8. Anular/Deshabilitar autorización en ASP.NET MVC 3
- 9. Autorización personalizada en ASP.NET MVC 3
- 10. ASP.NET MVC - Hoja de estilos dinámica
- 11. Autenticación de formulario personalizado/Esquema de autorización en ASP.net MVC
- 12. Autorización Asp.net web.config
- 13. Autorización basada en permisos en ASP.NET MVC3
- 14. Asp.net memebership autorización sin contraseña
- 15. Encabezado de autorización HTTP ASP.NET
- 16. Asp.Net MVC 3 Editor para la propiedad dinámica
- 17. Documentación dinámica para servicios web RESTful ASP.Net MVC
- 18. asignación dinámica de roles a los controladores en ASP.Net MVC
- 19. Autorización personalizada MVC 3 y Ninject IoC
- 20. ASP.NET MVC ¿Ruta predeterminada?
- 21. IronPython en ASP.NET MVC
- 22. Autorización basada en datos en ASP.NET
- 23. ASP.NET MVC4 Seguridad, Autenticación y Autorización
- 24. ASP.NET Web API Questions - Autorización/Autenticación
- 25. ASP.NET MVC o WebForms?
- 26. Cómo redirigir a una URL de inicio de sesión dinámica en ASP.NET MVC
- 27. ASP.NET MVC: Autorización dentro de una Acción - Patrones sugeridos o ¿esto es un olor?
- 28. ¿Cómo se prueba la autorización de la página web mediante ASP.NET MVC?
- 29. Cómo paso en el repositorio a un atributo de autorización en ASP.NET MVC
- 30. ¿Cómo debo manejar la Autorización/Autenticación en mi aplicación Asp.net MVC?
Soy bastante nuevo en esas cosas, pero vi un ejemplo en el que el rol se asignó específicamente en el código, y NO LO quiero. por ejemplo, algunos clientes pueden tener un grupo de usuarios llamado "Ingeniero" que tiene privilegios específicos. Quiero que pueda configurarlos desde el panel de administración, sin tocar ningún código. En este momento, no puedo ver cómo se puede usar el atributo Autorizar estándar para ese – xantrus
Gracias, lo comprobaré – xantrus
Bueno, entonces tendría que agregar búsquedas en su base de datos en algún momento, tal vez coincidir con el usuario y el controlador/nombres de acción con una regla de acceso que tiene en el DB. O algo así. – rmac