asp.net mvc 2 - net - ¿Cómo evitar que IIS7 maneje el código de estado HTTP 401?
web forms c# tutorial (2)
Acabo de encontrar una solución fácil para este problema. Acabo de agregar una nueva configuración en el archivo web.config como el siguiente código. Todo funciona bien en mi sitio web de implementación.
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.webServer>
<httpErrors errorMode="Custom" existingResponse="PassThrough">
<remove statusCode="502" subStatusCode="-1" />
<remove statusCode="501" subStatusCode="-1" />
<remove statusCode="500" subStatusCode="-1" />
<remove statusCode="412" subStatusCode="-1" />
<remove statusCode="406" subStatusCode="-1" />
<remove statusCode="405" subStatusCode="-1" />
<remove statusCode="404" subStatusCode="-1" />
<remove statusCode="403" subStatusCode="-1" />
<remove statusCode="401" subStatusCode="-1" />
</httpErrors>
</system.webServer>
</configuration>
Así que puedo crear una página de error personalizada tanto en texto sin formato como en respuesta JSON también.
Para más información: HttpErrorsSection Class
PD. Pero no puedo encontrar el atributo existingResponse en la característica de páginas de error del administrador de IIS.
Estoy trabajando en mi proyecto ASP.NET MVC 2. Creé un filtro de excepción para capturar excepciones de acceso no autorizado que ocurren cuando el usuario no tiene permiso para ver alguna acción.
[CustomError(typeof(UnauthorizedAccessException), "Error", "UnauthorizedAccess")]
public class MyController : BaseController
{
}
Después de lanzar la excepción, mi filtro se transferirá a un controlador / acción configurado que es el siguiente método.
public ActionResult UnauthorizedAccess(ExceptionContext context)
{
Response.StatusCode = CustomHttpStatusCode.UnauthorizedUser;
return View(model);
}
Finalmente, antes de que la aplicación ASP.NET finalice esta solicitud, llamará al siguiente método que se encuentra en Global.ascx para cambiar el código de estado HTTP personalizado al estado HTTP 401 (acceso no autorizado).
public void Application_EndRequest(object sender, EventArgs e)
{
if (Response.StatusCode == CustomHttpStatusCode.UnauthorizedUser)
{
Response.StatusCode = 401;
}
}
Todo funciona bien en mi máquina (IIS 7.5). Pero no funciona en mi sitio web de implementación. Todavía devuelve texto sin formato "No tiene permiso para ver este directorio o página". en lugar de mi página de error personalizada
PD. La siguiente configuración es mi web.config actual para este caso.
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.web>
<customErrors mode="On"></customErrors>
</system.web>
<system.webServer>
<httpErrors errorMode="Custom">
<remove statusCode="502" subStatusCode="-1" />
<remove statusCode="501" subStatusCode="-1" />
<remove statusCode="500" subStatusCode="-1" />
<remove statusCode="412" subStatusCode="-1" />
<remove statusCode="406" subStatusCode="-1" />
<remove statusCode="405" subStatusCode="-1" />
<remove statusCode="404" subStatusCode="-1" />
<remove statusCode="403" subStatusCode="-1" />
<remove statusCode="401" subStatusCode="-1" />
</httpErrors>
</system.webServer>
</configuration>
Puede pasar los mensajes de error predeterminados de IIS7 de dos maneras
Una es establecer response.TrySkipIisCustomErrors para que sea cierto
response.TrySkipIisCustomErrors = true;
response.Status = response.Status;
Por algún motivo, TrySkipIisCustomErrors no se respeta si no establece response.Status.
La otra es establecer existingResponse en "PassThrough" en web.config
<configuration>
<system.webServer>
<httpErrors existingResponse="PassThrough" />
</system.webServer>
</configuration>
Pero esto ignorará todas las páginas de error personalizadas de IIS.