2009-07-02 19 views
9

¿Cuál es la mejor forma de manejar una contraseña expirada en una aplicación ASP.NET MVC?ASP.NET MVC: cómo manejar una contraseña caducada?

Me explico - ASP.NET MVC se establece obviamente arriba (tanto en la aplicación de barebones el ejemplo NerdDinner) para manejar los siguientes escenarios:

  • Registro nuevos usuarios
  • permitirles que cambien su contraseña
  • sesión con una cuenta/contraseña válida

lo que no tiene es una muy buena manera de hacer lo siguiente:

  • obligar al usuario a cambiar su contraseña si ha caducado

La forma de ASP.NET MVC puntos de pensamiento a la idea de tener el usuario vaya a una URL/vista separada para realizar los cambios de contraseña .

El problema con esta idea es que no quiero que la gente sea capaz de ir a esta URL si no está conectado, y no quiero que ellos sean capaces de ir a ningún otro sitio en el sitio con una contraseña caducada.

En el pasado, la forma en que he manejado esto es hacer que el usuario no abandone la página de inicio de sesión y tener un panel ASP.NET que se muestra con el bit "oh hey you need to change your password", y esconde resto de la página. En este punto, el usuario aún no ha iniciado sesión, por lo que no se autenticará y no podrá ir a ninguna parte hasta que cambie su contraseña.

Pero ASP.NET MVC lo hace difícil. Si me gusta más arriba y tengo todo en la página de inicio de sesión, entonces tengo que tener una acción de inicio de sesión muy engorrosa para manejar todos los posibles valores publicados. Si lo publico en otra acción/vista, corro el riesgo de tener que iniciar sesión en el usuario o hacer que la página de cambio de contraseña no esté protegida por autenticación (ya que, a diferencia del bit "cambiar contraseña" que se le proporciona, no quiero que sean autenticados cuando ven la página).

Puedo imaginar algunos escenarios en los que podría establecer algo en ViewData para indicar que la contraseña ha caducado e insistir en redireccionar al usuario a la página "Cambiar contraseña", pero no estoy seguro de si eso es seguro o no. .

Respuesta

6

Consideraría utilizar un AuthorizeFilter personalizado (que amplíe el existente) que establece ActionResult en AuthorizationContext para redirigir a su acción de cambio de contraseña si el usuario está autenticado pero la contraseña ha expirado. Esto les permitiría iniciar sesión normalmente, pero restringirlos solo a esa acción si su contraseña ha expirado. Utilizo un enfoque similar en una de mis aplicaciones que redirige a una persona a una página de inscripción de eventos si están registrados en el sitio pero aún no se han inscripto para un evento (es una aplicación de administración de eventos de caridad).

Es posible que incluso pueda implementarlo como un filtro separado y aún usar el existente para la autorización.

[Authorize] 
[RequiresUnexpiredPassword] 
public class MyController : Controller 
{ 
    ... 
} 

Por supuesto, usted tiene que asegurarse se permite la acción ChangePassword proceder sin ser redirigido por el filtro.

+1

Creo que no es una buena idea crear el atributo RequiresUnexpiredPassword porque tendrá que aplicar este atributo a TODOS los controladores [Suponiendo que el autor no desea que el usuario explore la aplicación con la contraseña caducada]. Es mejor modificar el comportamiento del atributo Autorizar en sí. – SolutionYogi

+1

Debe recordar decorar los métodos/controladores con el atributo Autorizar también. Como dije, puedes extender el filtro de autorización O tener un atributo separado. Un atributo separado estaría en consonancia con el principio de responsabilidad única y también sería flexible. En este caso, sin embargo, probablemente acepte mi primera sugerencia, que también es su sugerencia menos la excepción, y utilice un filtro de autorización personalizado. – tvanfosson

+0

Sí, pero el atributo Autorizar ya está en su lugar, por lo que es un punto discutible. – SolutionYogi

4

¿Qué le parece crear un AuthorizationAttribute personalizado y anular el método OnAuthorization [Código de ejemplo aquí: asp.net mvc Adding to the AUTHORIZE attribute].

En ese método, puede verificar si la contraseña ha expirado, lanzar PasswordExpiredException. Capture esta excepción en el controlador base y redirija al usuario a la acción 'Cambiar contraseña'.

+5

¿Por qué lanzar una excepción cuando puede? simplemente configure la propiedad de resultado AuthorizeContext y haga la redirección? – tvanfosson

Cuestiones relacionadas