Personalizar la autorización en ASP.NET MVC

La clase My Controller está decorada con un AuthorizeAttribute para proteger las acciones:

[Authorize(Roles = "User Level 2")] public class BuyController : Controller { ... } 

Cada vez que se invoca una acción pero el usuario no tiene al menos el rol de “Nivel de usuario 2”, se le redirige automáticamente a la página de inicio de sesión con una URL como esta:

http: // localhost: 1436 / Account / Login? ReturnUrl =% 2fComprar

Si el usuario ya inició sesión, pero no tiene el nivel de seguridad adecuado, ¡este no es un comportamiento óptimo! Tendría más sentido mostrar una página que informa al usuario sobre el nivel que falta en lugar de mostrar la página de inicio de sesión.

¿Qué puedo hacer para personalizar este comportamiento? ¿Es posible pasar el nivel de usuario requerido a la acción de inicio de sesión de alguna manera?

Puede construir su propio atributo authorize de esta manera:

 public class ClubAuthorizeAttribute : AuthorizeAttribute { public override void OnAuthorization(AuthorizationContext filterContext) { base.OnAuthorization(filterContext); if (filterContext.Cancel && filterContext.Result is HttpUnauthorizedResult) { filterContext.Result = new RedirectToRouteResult( new RouteValueDictionary { { "clubShortName", filterContext.RouteData.Values[ "clubShortName" ] }, { "controller", "Account" }, { "action", "Login" }, { "ReturnUrl", filterContext.HttpContext.Request.RawUrl } }); } } } 

Utilicé esto para redirigir a un club específico en el sitio de membresía del club que estoy construyendo. Podrías adaptar esto a tu necesidad. Por cierto, en mi caso lo redirecciono a la página de inicio de sesión, pero verifico si el usuario está autorizado y, de ser así, muestra un mensaje de que no tienen los permisos correctos. Sin duda, también podría agregar algo a ViewData o TempData para mostrar en la página, pero no lo he intentado

EDITAR AuthorizationContext.Cancel ya no existe en RC. “filterContext.Result es HttpUnauthorizedResult” parece ser suficiente: ¿qué pasó con filterContext.Cancel (ASP.NET MVC)

El tiempo ha pasado desde la última respuesta.

Desde 2009, se ha avanzado mucho en el espacio de autorización. En particular, OASIS (los que están detrás de SAML) han estandarizado XACML, el Lenguaje de marcado de control de acceso extensible.

XACML ofrece a los desarrolladores:

  • un patrón de uso
  • una architecture
  • un lenguaje de política de autorización flexible

XACML está en línea con el control de acceso basado en atributos que NIST recomienda adoptar en las aplicaciones actuales.

Mire esta respuesta para más detalles.