tag route page net for data asp all asp.net-mvc

asp.net-mvc - route - tag helpers asp net core



Código de respuesta 401 para solicitudes json con ASP.NET MVC (7)

Puede optar por crear un FilterAttribute personalizado que implemente la interfaz IAuthorizationFilter .

En este atributo agrega lógica para determinar si la solicitud debe devolver JSON. De ser así, puede devolver un resultado JSON vacío (o hacer lo que quiera) dado que el usuario no ha iniciado sesión. En el caso de otras respuestas, simplemente redirigirá al usuario como siempre.

Incluso mejor, podría anular la AuthorizeAttribute OnAuthorization de AuthorizeAttribute para que no tenga que reinventar la rueda. Agregue la lógica que mencioné anteriormente e intercepte si filterContext.Cancel es verdadero (el filterContext.Result se establecerá en una instancia de la clase HttpUnauthorizedResult .

Lea más sobre "Filtros en ASP.NET MVC CodePlex Preview 4" en el blog de Phil Haacks. También se aplica a la última vista previa.

¿Cómo deshabilitar el manejo estándar de ASP.NET del código de respuesta 401 (redirigir a la página de inicio de sesión) para las solicitudes AJAX / JSON?

Para las páginas web está bien, pero para AJAX necesito obtener el código de error 401 correcto en lugar de 302/200 para la página de inicio de sesión.

Actualización : hay varias soluciones de Phil Haack, PM de ASP.NET MVC - http://haacked.com/archive/2011/10/04/prevent-forms-authentication-login-page-redirect-when-you-donrsquot -want.aspx


El tiempo de ejecución de ASP.NET está desarrollado para que siempre redirija al usuario si HttpResponse.StatusCode está establecido en 401, pero solo si se encuentra la sección <authentication /> del Web.config.

La eliminación de la sección de autenticación requerirá implementar la redirección a la página de inicio de sesión en su atributo, pero esto no debería ser un gran problema.


También puede usar Global.asax para interrumpir este proceso con algo como esto:

protected void Application_PreSendRequestHeaders(object sender, EventArgs e) { if (Response.StatusCode == 401) { Response.Clear(); Response.Redirect(Response.ApplyAppPathModifier("~/Login.aspx")); return; } }


En ASP.NET clásico obtienes un código de respuesta http 401 cuando llamas a un WebMethod con Ajax. Espero que lo cambien en futuras versiones de ASP.NET MVC. En este momento estoy usando este truco:

protected void Application_EndRequest() { if (Context.Response.StatusCode == 302 && Context.Request.Headers["X-Requested-With"] == "XMLHttpRequest") { Context.Response.Clear(); Context.Response.StatusCode = 401; } }


Quería la autenticación Forms y devolver un 401 para las solicitudes Ajax que no fueron autenticadas.

Al final, creé un AuthorizeAttribute personalizado y decoré los métodos del controlador. (Esto está en .Net 4.5)

//web.config

<authentication mode="Forms"> </authentication>

//controlador

[Authorize(Roles = "Administrator,User"), Response302to401] [AcceptVerbs("Get")] public async Task<JsonResult> GetDocuments() { string requestUri = User.Identity.Name.ToLower() + "/document"; RequestKeyHttpClient<IEnumerable<DocumentModel>, string> client = new RequestKeyHttpClient<IEnumerable<DocumentModel>, string>(requestUri); var documents = await client.GetManyAsync<IEnumerable<DocumentModel>>(); return Json(documents, JsonRequestBehavior.AllowGet); }

// authorizeAttribute

public class Response302to401 : AuthorizeAttribute { protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) { if (!filterContext.HttpContext.User.Identity.IsAuthenticated) { if (filterContext.HttpContext.Request.IsAjaxRequest()) { filterContext.Result = new JsonResult { Data = new { Message = "Your session has died a terrible and gruesome death" }, JsonRequestBehavior = JsonRequestBehavior.AllowGet }; filterContext.HttpContext.Response.StatusCode = 401; filterContext.HttpContext.Response.StatusDescription = "Humans and robots must authenticate"; filterContext.HttpContext.Response.SuppressFormsAuthenticationRedirect = true; } } //base.HandleUnauthorizedRequest(filterContext); } }


No veo lo que tenemos que modificar el modo de autenticación o la etiqueta de autenticación como dice la respuesta actual.

Siguiendo la idea de @TimothyLeeRussell (gracias por cierto), creé un atributo Authorize personalizado (el problema con el de @TimothyLeeRussell es que se lanza una excepción porque intenta cambiar el filtroContext.Result y genera una HttpException, y eliminando esa parte, además de filterContext.HttpContext.Response.StatusCode = 401, el código de respuesta siempre fue 200 OK). Así que finalmente resolví el problema finalizando la respuesta después de los cambios.

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)] public class BetterAuthorize : AuthorizeAttribute { protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) { if (filterContext.HttpContext.Request.IsAjaxRequest()) { //Set the response status code to 500 filterContext.HttpContext.Response.StatusCode = (int)HttpStatusCode.Unauthorized; filterContext.HttpContext.Response.StatusDescription = "Humans and robots must authenticate"; filterContext.HttpContext.Response.SuppressFormsAuthenticationRedirect = true; filterContext.HttpContext.Response.End(); } else base.HandleUnauthorizedRequest(filterContext); } }


Puedes llamar a este método dentro de tu acción,

HttpContext.Response.End();

Ejemplo

public async Task<JsonResult> Return401() { HttpContext.Response.StatusCode = (int)HttpStatusCode.Unauthorized; HttpContext.Response.End(); return Json("Unauthorized", JsonRequestBehavior.AllowGet); }

Desde MSDN : el método End hace que el servidor web deje de procesar el script y devuelva el resultado actual. El contenido restante del archivo no se procesa.