¿Cuál es la mejor manera de hacer una redirección en un ActionFilterAttribute. Tengo un ActionFilterAttributellamado IsAuthenticatedAttributeFiltery que verificó el valor de una variable de sesión. Si la variable es falsa, quiero que la aplicación redirija a la página de inicio de sesión. Preferiría redirigir utilizando el nombre de la ruta, SystemLoginsin embargo, cualquier método de redireccionamiento en este punto estaría bien.
c#
asp.net-mvc
asp.net-mvc-3
redirect
routes
ryanzec
fuente
fuente

Respuestas:
Establecer filterContext.Result
Con el nombre de la ruta:
También puedes hacer algo como:
Si quieres usar
RedirectToAction:Se podría hacer público un
RedirectToActionmétodo en el controlador ( preferiblemente en su controlador de base ) que simplemente llama al protegidoRedirectToActiondeSystem.Web.Mvc.Controller. Agregar este método permite una llamada pública a ustedRedirectToActiondesde el filtro.Entonces su filtro se vería así:
fuente
protectedpara que no tengas acceso desde el filtro.protected, debe haber alguna explicación razonable. Me siento muy sucio redefiniendo esta accesibilidadRedirectToActionsin entender por qué se encapsuló en primer lugar.Alternativamente a una redirección, si está llamando a su propio código, puede usar esto:
No es una redirección pura, pero ofrece un resultado similar sin una sobrecarga innecesaria.
fuente
actionContext.Result.ExecuteResultdesde su filtro de acción: MVC lo hará automáticamente después de que se ejecute el filtro de acción (siempreactionContext.Resultque no sea nulo).Estoy usando MVC4, utilicé el siguiente enfoque para redirigir una pantalla html personalizada en caso de incumplimiento de la autorización.
Extender
AuthorizeAttributedecirCutomAuthorizeranular elOnAuthorizationyHandleUnauthorizedRequestRegistre el
CustomAuthorizeren elRegisterGlobalFilters.al identificar la
unAuthorizedllamada de accesoHandleUnauthorizedRequesty redirigir a la acción del controlador en cuestión como se muestra a continuación.fuente
Parece que usted desea volver a poner en práctica, o posiblemente extender,
AuthorizeAttribute. Si es así, debe asegurarse de heredar eso, y noActionFilterAttribute, para que ASP.NET MVC haga más del trabajo por usted.Además, debe asegurarse de autorizar antes de realizar cualquier trabajo real en el método de acción; de lo contrario, la única diferencia entre iniciar sesión y no será qué página verá cuando termine el trabajo.
Hay una buena pregunta con una respuesta con más detalles aquí sobre SO.
fuente
Pruebe el siguiente fragmento, debe quedar bastante claro:
fuente
Aquí hay una solución que también tiene en cuenta si está utilizando solicitudes Ajax.
fuente
Esto funciona para mí (asp.net core 2.1)
fuente
podría heredar su controlador y luego usarlo dentro de su filtro de acción
dentro de su clase ActionFilterAttribute:
dentro de su controlador base:
Contras. de esto es cambiar todos los controladores para heredar de la clase "MyController"
fuente