ASP.NET expiration du mot de passe
j'utilise ASP.NET adhésion pour l'authentification de mon application web. Cela a très bien fonctionné pour moi. Je dois maintenant implémenter l'expiration du mot de passe.
si le mot de passe est expiré, l'utilisateur doit être redirigé vers l'écran ChangePassword
et ne doit pas avoir accès à une autre partie de l'application sans changer le mot de passe.
il y a beaucoup de pages aspx. Une solution pourrait être de rediriger vers l'écran ChangePassword
151920920" chaque aspx si le mot de passe a expiré. Est-il d'autres solutions ou des recommandations.
Merci, Jai
6 réponses
suite à réponse de csgero , j'ai trouvé que vous n'avez pas besoin d'ajouter explicitement un gestionnaire d'événements pour cet événement dans ASP.Net 2,0 (3,5).
, Vous pouvez simplement créer la méthode suivante dans global.asax
et il obtient filaire pour vous:
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");
}
}
}
vous pouvez ajouter un gestionnaire d'événements pour L'application HttpApplication.PostAuthenticateRequest événement mondial.asax et gérer la redirection.
suite à réponse D'Andrew , j'ai trouvé que vous devez vérifier que l'utilisateur n'est pas déjà sur la page de changement de mot de passe, ou ils ne seront jamais en mesure de réellement changer leur mot de passe, et donc ne jamais quitter le site de changement de mot de passe:
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");
}
}
}
vient d'implémenter ceci en environ une heure, pas besoin de modifier votre page de base. Voici ce que vous devez faire:
-
répondre à la
LoggingIn
Événement du contrôle des membres -
trouver l'utilisateur dans la base de données des membres et obtenir
LastPasswordChangedDate
-
comparez cela à la date courante et déterminez si le mot de passe a été modifié pour la dernière fois plus que le nombre requis de jours. J'obtiens cette valeur de web.config
-
si expiré, rediriger vers l'écran
ChangePassword
151940920 "
je suis arrivé ici à la recherche d'une solution mais ma technologie actuelle est ASP.NET MVC. Donc pour aider les autres: vous pouvez étendre la AuthorizeAttribute
, et remplacer OnAuthorization
méthode, comme ceci:
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);
}
}
Note: j'utilise T4MVC pour récupérer les noms de contrôleur et D'Action dans le code ci-dessus.
marquer tous les contrôleurs avec cet attribut sauf " AccountController
". Ceci n'utilisateur avec un mot de passe expiré sera en mesure de surfez sur le site.
voici un post que j'ai fait sur le sujet avec quelques points bonus:
j'ai utilisé le code ci-dessus et je ne l'ai que légèrement modifié pour l'implémenter en Asp.NET (4.5) MVC5 en utilisant le fournisseur D'identité .NET. Simplement laisser ici pour le gars à côté/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();
}
}