Pregunta

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 "Usuario Nivel 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 =% 2fBuy

Si el usuario ya ha iniciado sesión, pero no tiene el nivel de seguridad correcto, ¡este no es un comportamiento óptimo! Tendría más sentido mostrar una página que informa al usuario sobre el nivel faltante 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?

¿Fue útil?

Solución

Puede crear su propio atributo de autorización como este:

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 un sitio de membresía del club que estoy construyendo. Puede adaptar esto a su necesidad. Por cierto, en mi caso redirijo a la página de inicio de sesión, pero verifico si el usuario está autorizado y, de ser así, visualizo un mensaje que indica que no tiene 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é sucedió con filterContext.Cancel ( ASP.NET MVC)

Otros consejos

Ha pasado mucho tiempo 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 arquitectura
  • 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 hoy en día.

Eche un vistazo a esta respuesta para obtener más detalles.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top