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

21
demandé sur Charles 2008-12-08 14:52:34

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");
        }
    }
}
26
répondu Andrew 2017-05-23 12:06:46

vous pouvez ajouter un gestionnaire d'événements pour L'application HttpApplication.PostAuthenticateRequest événement mondial.asax et gérer la redirection.

13
répondu csgero 2008-12-08 14:17:29

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");
            }
        }
    } 
9
répondu rethenhouser2 2017-05-23 11:48:32

vient d'implémenter ceci en environ une heure, pas besoin de modifier votre page de base. Voici ce que vous devez faire:

  1. répondre à la LoggingIn Événement du contrôle des membres

  2. trouver l'utilisateur dans la base de données des membres et obtenir LastPasswordChangedDate

  3. 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

  4. si expiré, rediriger vers l'écran ChangePassword 151940920 "

6
répondu Jeff Atwood 2011-05-18 08:55:39

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:

mot de passe de l'utilisateur ASP.NET MVC

4
répondu Leniel Maccaferri 2012-05-24 15:06:56

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();
        }
    }
0
répondu Tommy Snacks 2016-03-10 21:32:20