En ASP.NET MVC, puede marcar un método controlador con AuthorizeAttribute
, así:¿Por qué AuthorizeAttribute redirige a la página de inicio de sesión para las fallas de autenticación y autorización?
[Authorize(Roles = "CanDeleteTags")]
public void Delete(string tagName)
{
// ...
}
Esto significa que, si ha iniciado la sesión en el usuario no está en el papel "CanDeleteTags", el controlador método nunca será llamado.
Desafortunadamente, para las fallas, AuthorizeAttribute
devuelve HttpUnauthorizedResult
, que siempre devuelve el código de estado HTTP 401. Esto causa una redirección a la página de inicio de sesión.
Si el usuario no ha iniciado sesión, tiene mucho sentido. Sin embargo, si el usuario está ya registrado en, pero no está en la función requerida, es confuso enviarlos de nuevo a la página de inicio de sesión.
Parece que AuthorizeAttribute
combina autenticación y autorización.
Esto parece un poco un descuido en ASP.NET MVC, o me falta algo?
He tenido que cocinar un DemandRoleAttribute
que separa los dos. Cuando el usuario no está autenticado, devuelve HTTP 401 y lo envía a la página de inicio de sesión. Cuando el usuario inicia sesión, pero no está en la función requerida, crea un NotAuthorizedResult
en su lugar. Actualmente esto redirige a una página de error.
Seguramente no tuve que hacer esto?
Excelente pregunta y estoy de acuerdo, debería arrojar un estado de HTTP no autorizado. –
Me gusta su solución, Roger. Incluso si no lo haces. –
Mi página de inicio de sesión tiene un cheque para simplemente redirigir al usuario a ReturnUrl, si ya está autenticado. Así que logré crear un bucle infinito de 302 redirecciones: D woot. –