Me gustaría generar una página 401 si el usuario no tiene el permiso correcto.Cómo interceptar 401 desde la autenticación de formularios en ASP.NET MVC?
El usuario solicita una url y se le redirige a la página de inicio de sesión (he denegado todo anónimo en web.config). El usuario inicia sesión correctamente y se redirige a la url original. Sin embargo, al comprobar el permiso, se determina que el usuario no tiene el permiso requerido, por lo que me gustaría generar un 401. Pero la autenticación de formularios siempre maneja 401 y redirige al usuario a la página de inicio de sesión.
Para mí, esto no es correcto. El usuario ya ha autenticado , el usuario simplemente no tiene la autorización correcta.
En otros escenarios, como en ajax o escenario de servicio REST, definitivamente no quiero la página de inicio de sesión, necesito la página 401 adecuada.
Hasta ahora, he intentado personalizar el filtro Autorizar para devolver ViewResult con 401 pero no funcionó. Luego probé un filtro de acción normal, anulando OnActionExecuting, que tampoco funcionaba.
Lo que pude hacer es controlar un evento en global.asax, PostRequestHandlerExecute, y compruebe si el permiso luego escribir directamente a la respuesta:
if (permissionDenied)
{
Context.Response.StatusCode = 401;
Context.Response.Clear();
Context.Response.Write("Permission Denied");
Context.Response.Flush();
Context.Response.Close();
return;
}
que funciona, pero no es realmente lo que quiero. Antes que nada, ni siquiera estoy seguro de si ese es el evento correcto o el lugar en la tubería para hacer eso. En segundo lugar, quiero que la página 401 tenga un poco más de contenido. Preferiblemente, debería ser una página aspx con posiblemente la misma página maestra que el resto del sitio. De esta forma, cualquier persona que navegue por el sitio puede ver que se deniega el permiso pero con la misma apariencia, etc., pero el usuario de Ajax o del servicio obtendrá el código de estado adecuado para actuar.
¿Alguna idea de cómo se puede lograr esto? He visto otras publicaciones con solicitudes similares, pero no vi una solución que pueda usar.
Y no, no quiero un 403.
No estoy seguro de a cuál de las respuestas me está dirigiendo. En cualquier caso, no quiero volver a enrutar o redirigir porque entonces mi estado de respuesta no será 401 - será algo así como 302 seguido de 200, que no es lo que esperaría si estuviera accediendo a la url de un cliente ajax –
Jiho - Me disculpo, no leí la pregunta lo suficientemente cerca. Pensé que solo estabas tratando de hacer una redirección 401 personalizada. – Robaticus