tag route page net mvc for asp asp.net-mvc authentication

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



El constructor del controlador ASP.NET MVC llamado antes de la autenticación (4)

Tengo una aplicación ASP.NET MVC con un controlador que se ve así:

[Authorize] public class MyController : Controller { IMyRepository myRepository; public MyController(IMyRepository myRepository) { this.myRepository = myRepository; } ... }

Me he dado cuenta de que se llama a este constructor antes de autenticar al usuario, por lo que si está visitando la página por primera vez, se llama al constructor antes de redirigirlo a la pantalla de inicio de sesión. Hay muchos problemas con esto, la página de inicio de sesión se carga más despacio, el sitio tiene una mayor exposición a ataques DOS, y estoy un poco nervioso acerca de usuarios no autenticados y no autorizados que pueden invocar el código ''detrás de las paredes''.

Podría verificar la solicitud entrante en el constructor y fianza a menos que el usuario esté autorizado, pero estoy usando IOC (Windsor), lo que hace que sea un poco complicado, mi repositorio se va a inicializar independientemente de si guardo o no la instancia, entonces me quedaría revisando la autenticación en el constructor de cada repositorio. ¿Hay alguna manera fácil de obtener .NET MVC para autenticar al usuario antes de invocar el constructor? Estoy pensando en agregar [PrincipalPermission(SecurityAction.Demand, Authenticated = true)] al controlador, pero aún podría haber una mejor manera.

EDITAR:

Ok, no muy feliz, pero el show debe continuar por ahora. No puedo retrasar la inicialización del repositorio hasta algún momento posterior dentro del controlador. Cuando tu controlador usa IOC como en mi ejemplo, obtienes una implementación ya instanciada de tu interfaz de repositorio en el momento en que se crea una instancia del controlador. Si tuviera control sobre el repositorio que se está creando, podría simplemente llamar a IsAuthenticated, sin necesidad de un nuevo método. Para tomar el control de la inicialización del repositorio, debería implementar algún tipo de inicialización diferida / tardía en el repositorio mismo en cada implementación. No me gusta esta solución porque agrega una complejidad innecesaria y, lo que es más importante, un acoplamiento entre el controlador y el repositorio. La (s) implementación (es) del repositorio pueden usarse en otros contextos donde la inicialización lenta no tiene sentido en mi humilde opinión.


El controlador debe crearse una instancia antes de que se OnAuthorization la autorización, ya que puede actuar como su propio filtro de autorización a través del método OnAuthorization . Cambiar ese comportamiento implicaría reemplazar algunas partes centrales de la tubería de mvc. ¿Hay alguna razón en particular por la que piensas que AuthorizedAttribute podría no hacer su trabajo?


En términos de ataques DOS, realmente no debería importar - después del primer golpe, que se ve mucho cuando se desarrolla, la instanciación del controlador debe ser barata. Bueno, a menos que esté DDOSing usted mismo haciendo que el constructor haga un trabajo real, como las búsquedas en la base de datos de precaching. . .


Pablo,

la creación de instancias del controlador implica muchos procesos por delante de cualquier acción en el controlador que se pueda llamar. incluso si el atacante intentara beneficiarse de este lapso de tiempo entre la instanciación y la pantalla de inicio de sesión, la acción del controlador solo se podría ejecutar si la acción tuviera la autoridad para hacerlo, es decir, supongo que sus acciones o controlador tener el atributo [Authorize] en ellos.

No creo que deba preocuparse demasiado por esto y puede descansar tranquilo, aunque entiendo su curiosidad obvia.