En ASP.NET, FormsAuthenticationModule intercepta cualquier HTTP 401 y devuelve un redireccionamiento HTTP 302 a la página de inicio de sesión. Esto es un problema para AJAX, ya que pide json y obtiene la página de inicio de sesión en html, pero el código de estado es HTTP 200.Prevención de formularios AutenticaciónMódulo de interceptación de respuestas de API Web ASP.NET
¿Cuál es la forma de evitar esta intercepción en ASP.NET Web API?
En ASP.NET MVC4 es muy fácil de prevenir esta intercepción, poniendo fin a la conexión de forma explícita:
public class MyMvcAuthFilter:AuthorizeAttribute
{
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
if (filterContext.HttpContext.Request.IsAjaxRequest() && !filterContext.IsChildAction)
{
filterContext.Result = new HttpStatusCodeResult(401);
filterContext.HttpContext.Response.StatusCode = 401;
filterContext.HttpContext.Response.SuppressContent = true;
filterContext.HttpContext.Response.End();
}
else
base.HandleUnauthorizedRequest(filterContext);
}
}
Pero en API Web ASP.NET no puedo finalizar la conexión de forma explícita, por lo que incluso cuando se utiliza este código de la FormsAuthenticationModule intercepta la respuesta y envía un redireccionamiento a la página de inicio de sesión:
public class MyWebApiAuth: AuthorizeAttribute
{
protected override void HandleUnauthorizedRequest(System.Web.Http.Controllers.HttpActionContext actionContext)
{
if(actionContext.Request.Headers.Any(h=>h.Key.Equals("X-Requested-With",StringComparison.OrdinalIgnoreCase)))
{
var xhr = actionContext.Request.Headers.Single(h => h.Key.Equals("X-Requested-With", StringComparison.OrdinalIgnoreCase)).Value.First();
if (xhr.Equals("XMLHttpRequest", StringComparison.OrdinalIgnoreCase))
{
// this does not work either
//throw new HttpResponseException(HttpStatusCode.Unauthorized);
actionContext.Response = new System.Net.Http.HttpResponseMessage(System.Net.HttpStatusCode.Unauthorized);
return;
}
}
base.HandleUnauthorizedRequest(actionContext);
}
}
¿Cuál es la forma de evitar este comportamiento en ASP.NET web API? He estado mirando y no he podido encontrar la manera de hacerlo.
Atentamente.
PD: No puedo creer que esto sea en 2012 y este problema aún está activo.
Para cualquier otra persona buscando, intente esto: http://blog.craigtp.co.uk/post/OWIN-Hosted-Web-API-in-an-MVC-Project – Sentinel
El enlace publicado por @Sentinel corrige mi problema ... ¡gracias! –