Este problema me ha perseguido durante algunos días, así que al encontrar la respuesta que afirmativamente funciona con la respuesta de tvanfosson anterior, pensé que valdría la pena enfatizar la parte central de la respuesta y abordar algunas capturas relacionadas.
La respuesta básica es la siguiente, dulce y simple:
filterContext.Result = new HttpUnauthorizedResult();
En mi caso heredar de un controlador de base, por lo que en cada controlador que herede de ella puedo reemplazar OnAuthorize:
protected override void OnAuthorization(AuthorizationContext filterContext)
{
base.OnAuthorization(filterContext);
YourAuth(filterContext); // do your own authorization logic here
}
El problema fue que en 'YourAuth', probé dos cosas que pensé que no solo funcionarían, sino que también terminarían inmediatamente la solicitud. Bueno, así no es como funciona. Así que, primero, las dos cosas que no funcionan, de forma inesperada:
filterContext.RequestContext.HttpContext.Response.Redirect("/Login"); // doesn't work!
FormsAuthentication.RedirectToLoginPage(); // doesn't work!
No sólo los aquellos que no funciona, que no terminen la solicitud tampoco. Lo que significa lo siguiente:
if (!success) {
filterContext.Result = new HttpUnauthorizedResult();
}
DoMoreStuffNowThatYouThinkYourAuthorized();
Bueno, incluso con la respuesta correcta anterior, ¡el flujo de la lógica aún continúa! Seguirá presionando DoMoreStuff ... dentro de OnAuthorize. Así que tenlo en cuenta (DoMore ... debería estar en otro modo por lo tanto).
Pero con la respuesta correcta, mientras OnAuthorize el flujo de la lógica continúa hasta el final, después de eso realmente obtienes lo que esperas: un redireccionamiento a tu página de inicio de sesión (si tienes uno configurado en Forms auth en tu webconfig) .
Pero inesperadamente, 1) Response.Redirect ("/ login") no funciona: el método de acción todavía se llama, y 2) FormsAuthentication.RedirectToLoginPage(); hace lo mismo: ¡el método de Acción todavía se llama!
Lo cual me parece totalmente incorrecto, particularmente con este último: ¿quién hubiera pensado que FormsAuthentication.RedirectToLoginPage no finaliza la solicitud, o no hace el equivalente anterior de lo que filterContext.Result = new HttpUnauthorizedResult() hace?
Supongo que no hay un enlace al que pueda ir, que lo divide en un poco más fácil de seguir los razonamientos? – Maslow
¿Qué no está claro? Primero usa AuthorizeCore para verificar si el usuario está autorizado y en un rol permitido. De lo contrario, si el usuario no está autenticado, devuelve una respuesta no autorizada estableciendo el resultado en el contexto del filtro. Si se autentica, entonces verifica si está en la función adicional de "SuperUser" (una función predeterminada, no especificada en el atributo). De lo contrario, devuelve un error que indica que, aunque está autorizado, el usuario no tiene un rol válido para la acción. Cuando el usuario está autorizado y tiene un rol válido (o SuperUser), establece la política de caché para evitar el almacenamiento en caché en sentido descendente – tvanfosson
He encontrado una mejor respuesta aquí: http://stackoverflow.com/questions/1498727/asp-net-mvc- how-to-show-desautorizado-error-on-login-page – bluee