Omitir la redirección automática de autenticación de formularios para iniciar sesión, ¿cómo hacerlo?

StackOverflow https://stackoverflow.com/questions/35322

Pregunta

Estoy escribiendo una aplicación usando asp.net-mvc implementándola en iis6.Estoy usando autenticación de formularios.Por lo general, cuando un usuario intenta acceder a un recurso sin la autorización adecuada, quiero que sea redirigido a una página de inicio de sesión.FormsAuth hace esto por mí con bastante facilidad.

Problema:Ahora tengo una acción a la que accede una aplicación de consola.¿Cuál es la forma más rápida de que esta acción responda con el estado 401 en lugar de redirigir la solicitud a la página de inicio de sesión?

Quiero que la aplicación de consola pueda reaccionar a este código de estado 401 en lugar de que sea transparente.También me gustaría mantener el comportamiento predeterminado de redirigir las solicitudes no autorizadas al comportamiento de la página de inicio de sesión.

Nota:Como prueba, agregué esto a mi global.asax y no omitió la autenticación de formularios:

protected void Application_AuthenticateRequest(object sender, EventArgs e)
{
    HttpContext.Current.SkipAuthorization = true;
}

@Dale y Andy

Estoy usando AuthorizeAttributeFilter proporcionado en la vista previa 4 de MVC.Esto devuelve un HttpUnauthorizedResult.Este resultado establece correctamente el código de estado en 401.El problema, según tengo entendido, es que asp.net intercepta la respuesta (ya que está etiquetada como 401) y la redirige a la página de inicio de sesión en lugar de simplemente dejarla pasar.Quiero evitar esta interceptación para determinadas URL.

¿Fue útil?

Solución

Ok, solucioné esto.Hice un ActionResult personalizado (HttpForbiddenResult) y un ActionFilter personalizado (NoFallBackAuthorize).

Para evitar la redirección, HttpForbiddenResult marca las respuestas con el código de estado 403.FormsAuthentication no detecta respuestas con este código, por lo que la redirección de inicio de sesión se omite de manera efectiva.El filtro NoFallBackAuthorize comprueba si el usuario está autorizado de forma muy similar al filtro Autorizar incluido.Se diferencia en que devuelve HttpForbiddenResult cuando se deniega el acceso.

El HttpForbiddenResult es bastante trivial:

public class HttpForbiddenResult : ActionResult
{
    public override void ExecuteResult(ControllerContext context)
    {
        if (context == null)
        {
            throw new ArgumentNullException("context");
        }
        context.HttpContext.Response.StatusCode = 0x193; // 403
    }
}

No parece posible omitir la redirección de la página de inicio de sesión en FormsAuthenticationModule.

Otros consejos

Puede ser una pifia (y puede que ni siquiera funcione), pero en su página de inicio de sesión vea si Request.QueryString["ReturnUrl"] != null y si es así configurado Response.StatusCode = 401.

Tenga en cuenta que aún necesitará que la aplicación de su consola se autentique de alguna manera.No obtienes autenticación básica HTTP de forma gratuita:Tienes que crear el tuyo propio, pero hay muchas implementaciones.

¿Escribiste tu propio atributo FormsAuth para la acción?Si es así, en el método OnActionExecuting, se le pasa FilterExecutingContext.Puede usar esto para devolver el código 401.

public class FormsAuth : ActionFilterAttribute
{
    public override void OnActionExecuting(FilterExecutingContext filterContext)
    {
        filterContext.HttpContext.Response.StatusCode = 401;
        filterContext.Cancel = true;
    }
}

Esto debería funcionar.No estoy seguro si escribiste el atributo FormsAuth o si lo obtuviste de otro lugar.

Todavía no he usado AuthorizeAttribute que viene en la Vista previa 4.Hice el mío propio porque he estado usando el marco MVC desde el primer CTP.Eché un vistazo rápido al atributo en reflector y está haciendo lo que mencioné anteriormente internamente, excepto que usan el equivalente hexadecimal de 401.Tendré que mirar más arriba en la llamada para ver dónde se detecta la excepción, porque lo más probable es que sea allí donde estén realizando la redirección.Esta es la funcionalidad que deberá anular.No estoy seguro de que puedas hacerlo todavía, pero lo publicaré cuando lo encuentre y te daré una solución alternativa, a menos que Haacked vea esto y lo publique él mismo.

Busqué un poco en Google y esto es lo que encontré:


    HttpContext.Current.Response.StatusCode = 401;

No estoy seguro si funciona o no, no lo he probado.De cualquier manera, vale la pena intentarlo, ¿verdad?:)

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