Expiración de la contraseña de membresía de ASP.NET
authentication asp.net-membership (6)
Estoy usando membresía de ASP.NET para la autenticación de mi aplicación web. Esto funciono muy bien para mi. Ahora tengo que implementar la caducidad de la contraseña.
Si la contraseña ha caducado, el usuario debe ser redireccionado a la pantalla ChangePassword
y no se le debe permitir el acceso a ninguna otra parte de la aplicación sin cambiar la contraseña.
Hay muchas páginas aspx. Una solución podría ser redirigir a la pantalla OnInit
de cada aspx si la contraseña ha expirado. ¿Hay alguna otra solución o recomendación?
Gracias, Jai
Acabo de implementar esto en aproximadamente una hora, sin necesidad de modificar su página base. Aquí tienes lo que tienes que hacer:
Responda al evento
LoggingIn
del control de membresíaEncuentre al usuario en la base de datos de miembros y obtenga
LastPasswordChangedDate
Usando un TimeSpan, compare esto con la fecha actual y decida si la contraseña fue modificada por última vez más que el número requerido de días. Obtengo este valor de web.config
Si ha caducado, redirija a la pantalla
ChangePassword
Además de la respuesta de csgero , descubrí que no es necesario agregar explícitamente un controlador de eventos para este evento en ASP.Net 2.0 (3.5).
Simplemente puede crear el siguiente método en global.asax
y se lo conecta por usted:
void Application_PostAuthenticateRequest(object sender, EventArgs e)
{
if (this.User.Identity.IsAuthenticated)
{
// get user
MembershipUser user = Membership.GetUser();
// has their password expired?
if (user != null
&& user.LastPasswordChangedDate.Date.AddDays(90) < DateTime.Now.Date
&& !Request.Path.EndsWith("/Account/ChangePassword.aspx"))
{
Server.Transfer("~/ChangePassword.aspx");
}
}
}
Además de la respuesta de Andrew , descubrí que es necesario verificar que el usuario aún no esté en la página de cambio de contraseña, o que nunca podrán cambiar su contraseña, y por lo tanto, nunca abandonar el sitio de cambio de contraseña:
void Application_PostAuthenticateRequest(object sender, EventArgs e)
{
if (this.User.Identity.IsAuthenticated)
{
// get user
MembershipUser user = Membership.GetUser();
// has their password expired?
if (user != null
&& user.LastPasswordChangedDate.AddMinutes(30) < DateTime.Now
&& !Request.Path.EndsWith("/Account/ChangePassword.aspx"))
{
Server.Transfer("~/Account/ChangePassword.aspx");
}
}
}
Llegué aquí en busca de una solución a esto, pero mi tecnología actual es ASP.NET MVC. Para ayudar a los demás: puede extender AuthorizeAttribute
y anular el método OnAuthorization
, así:
public class ExpiredPasswordAttribute : AuthorizeAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
IPrincipal user = filterContext.HttpContext.User;
if(user != null && user.Identity.IsAuthenticated)
{
MembershipUser membershipUser = Membership.GetUser();
if (PasswordExpired) // Your logic to check if password is expired...
{
filterContext.HttpContext.Response.Redirect(
string.Format("~/{0}/{1}?{2}", MVC.SGAccount.Name, MVC.SGAccount.ActionNames.ChangePassword,
"reason=expired"));
}
}
base.OnAuthorization(filterContext);
}
}
Nota: uso T4MVC para recuperar los nombres de Controlador y Acción en el código anterior.
Marque todos los controladores con este atributo excepto " AccountController
". Al hacerlo, ningún usuario con una contraseña caducada podrá navegar por el sitio.
Aquí hay una publicación que hice sobre el tema con algunos puntos extra:
Atributo de filtro caducado de contraseña de usuario en ASP.NET MVC
Puede agregar un controlador de eventos para el evento HttpApplication.PostAuthenticateRequest en global.asax y manejar la redirección allí.
Utilicé el código de arriba y solo lo modifiqué ligeramente para implementar en Asp.NET (4.5) MVC5 usando el Proveedor de Identidad .NET. Solo dejándolo aquí para el próximo chico / gal :)
void Application_PostAuthenticateRequest(object sender, EventArgs e)
{
if (this.User.Identity.IsAuthenticated)
{
WisewomanDBContext db = new WisewomanDBContext();
// get user
var userId = User.Identity.GetUserId();
ApplicationUser user = db.Users.Find(userId);
// has their password expired?
if (user != null && user.PasswordExpires <= DateTime.Now.Date
&& !Request.Path.EndsWith("/Manage/ChangePassword"))
{
Response.Redirect("~/Manage/ChangePassword");
}
db.Dispose();
}
}