visual studio servidor error aplicación c# .net asp.net-mvc security authorization

c# - studio - error de servidor en la aplicación ''/'' error en runtime



Cómo hacer que el atributo Autorizar devuelva una página de error 403 personalizada en lugar de redireccionar a la página de inicio de sesión (2)

Debería poder crear su propia clase que se deriva de AuthorizeAttribute y anular el método AuthorizeCore para proporcionar el mecanismo de autorización que desee, de modo que pueda aplicar su código de autorización personalizado utilizando un atributo en lugar de moverlo al controlador.

Si necesita un control más detallado de la autorización, le recomiendo que cree una implementación de la interfaz IActionFilter (en un atributo, luego aplique el atributo a sus métodos). Esto le permitirá interceptar llamadas antes de que vayan al controlador, y proporcionar acciones alternativas antes de que se llame al método de su controlador.

Esto se logra implementando el método OnActionExecuting en la interfaz IActionFilter . Si su lógica determina que no debe realizar la llamada al controlador en absoluto, y desea proporcionar un ActionResult para que se procese en su lugar, entonces establecería la propiedad Result en la instancia ActionExecutingContext pasada al método. Al hacer esto, se procesa ActionResult lugar de ir al método del controlador para obtener un ActionResult .

Si desea devolver un código de error 403, entonces no puede usar la clase ContentResult . Deberá crear su propia clase que derive de ActionResult y anular el método ExecuteResult para establecer la propiedad StatusCode en HttpResponseBase en 403, de esta forma:

internal class Http403Result : ActionResult { public override void ExecuteResult(ControllerContext context) { // Set the response code to 403. context.HttpContext.Response.StatusCode = 403; } } public class CustomActionFilter : ActionFilterAttribute { public override void OnActionExecuting(ActionExecutingContext filterContext) { filterContext.Result = new Http403Result(); } }

Por supuesto, puede generalizar la clase Http403Result para tomar un constructor que acepte el código de estado que desea devolver, pero el concepto sigue siendo el mismo.

[Authorize] atributo [Authorize] es una invención agradable y práctica de MS, y espero que pueda resolver los problemas que tengo ahora

Para ser más especifico:

Cuando el cliente actual no está autenticado - [Authorize] redirecciona desde la acción segura a la página de inicio de sesión y luego de que el inicio de sesión fue exitoso - devuelve al usuario, esto es bueno.

Pero cuando el cliente actual ya se ha autenticado pero no está autorizado para ejecutar una acción específica, todo lo que necesito es solo mostrar mi página general 403.

¿Es posible sin mover la lógica de autorización dentro del cuerpo del controlador?

Actualización : el comportamiento que necesito debe ser semánticamente igual a este boceto:

public ActionResult DoWork() { if (!NotAuthorized()) { // this should be not redirect, but forwarding return RedirectToAction("403"); } return View(); }

Entonces, no debería haber ninguna redirección y la URL debería permanecer igual, pero el contenido de la página debe reemplazarse por 403 páginas.

Actualización 2 : Implementé el boceto de esta manera:

[HandleError] public class HomeController : Controller { public ActionResult Index() { ViewData["Message"] = "Welcome to ASP.NET MVC!"; return View(); } [CustomActionFilter] public ActionResult About() { return View(); } public ActionResult Error_403() { return Content("403"); } } public class CustomActionFilter : ActionFilterAttribute { public override void OnActionExecuting(ActionExecutingContext filterContext) { filterContext.Result = new ContentResult { Content = "403" }; } }

Y no se puede saber cómo reenviar correctamente la ejecución a HomeController.Action_403 () para que muestre 403.

Actualización 3 :

filterContext.Result = new ViewResult() { ViewName = "Error_403" };

así que esta es una respuesta sobre cómo renderizar una plantilla de vista específica ... pero todavía no tengo idea de cómo ejecutar otro controlador, de todos modos, es una solución bastante buena.


Lo que haría sería crear una subclase de AuthorizeAttribute y anular su HandleUnauthorizedRequest para devolver el código de estado HTTP 403 si el usuario está autenticado. Luego agregaría una sección system.webServer / httpErrors a mi Web.Config para reemplazar el 403 predeterminado con mi página personalizada (esta última parte requiere IIS 7+). Así es cómo:

public class MyAuthorizeAttribute : AuthorizeAttribute { protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) { if (filterContext.HttpContext.User.Identity.IsAuthenticated) filterContext.Result = new HttpStatusCodeResult(403); else filterContext.Result = new HttpUnauthorizedResult(); } } <configuration> <system.webServer> <httpErrors errorMode="Custom" existingResponse="Replace"> <remove statusCode="403" /> <error statusCode="403" responseMode="ExecuteURL" path="/Error/MyCustom403page" /> </httpErrors> </system.webServer> </configuration>