23 Stimmen

Ablauf des ASP.NET-Mitgliedschaftskennworts

Ich verwende ASP.NET-Mitgliedschaft für die Authentifizierung meiner Web-App. Das hat für mich gut funktioniert. Ich habe jetzt zu implementieren Passwort Ablauf.

Wenn das Kennwort abgelaufen ist, sollte der Benutzer zur folgenden Seite weitergeleitet werden ChangePassword und sollte ohne Änderung des Kennworts keinen Zugang zu einem anderen Teil der Anwendung erhalten.

Es gibt viele aspx-Seiten. Eine Lösung könnte die Umleitung auf die ChangePassword Bildschirm OnInit jeder aspx, wenn das Passwort abgelaufen ist. Gibt es irgendwelche anderen Lösungen oder Empfehlungen.

Danke! Jai

29voto

Andrew Punkte 12733

Weiter zu csgero's Antwort Ich habe herausgefunden, dass Sie in ASP.Net 2.0 (3.5) nicht explizit einen Event-Handler für dieses Ereignis hinzufügen müssen.

Sie können einfach die folgende Methode in global.asax und es wird für Sie verkabelt:

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");
        }
    }
}

13voto

csgero Punkte 2753

Sie könnten einen Ereignishandler für das Ereignis HttpApplication.PostAuthenticateRequest in global.asax hinzufügen und die Umleitung dort behandeln.

9voto

rethenhouser2 Punkte 390

Weiter zu Andrews Antwort Ich habe festgestellt, dass Sie überprüfen müssen, ob der Benutzer nicht bereits auf der Seite zum Ändern des Kennworts ist, sonst kann er sein Kennwort nicht ändern und verlässt die Seite zum Ändern des Kennworts nicht:

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");
            }
        }
    }

6voto

Gerade implementiert dies in etwa einer Stunde, keine Notwendigkeit, Ihre Basis-Seite zu ändern. Hier ist, was Sie zu tun haben:

  1. Reagieren Sie auf die LoggingIn Ereignis der Mitgliedschaftskontrolle

  2. Suchen Sie den Benutzer in der Mitgliederdatenbank und rufen Sie LastPasswordChangedDate

  3. Vergleichen Sie diesen Wert mit dem aktuellen Datum und entscheiden Sie, ob das Kennwort vor mehr als der erforderlichen Anzahl von Tagen zuletzt geändert wurde, indem Sie eine TimeSpan verwenden. Ich erhalte diesen Wert aus web.config

  4. Falls abgelaufen, Umleitung auf die ChangePassword Bildschirm

4voto

Leniel Maccaferri Punkte 96851

Ich habe hier auf der Suche nach einer Lösung für dieses, aber meine aktuelle Technologie ist ASP.NET MVC. Also, um anderen zu helfen: Sie können erweitern die AuthorizeAttribute und außer Kraft setzen OnAuthorization Methode, etwa so:

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);
    }
}

Anmerkung: Ich verwende T4MVC um die Controller- und Action-Namen im obigen Code abzurufen.

Markieren Sie alle Controller mit diesem Attribut außer " AccountController ". Auf diese Weise kann kein Benutzer mit einem abgelaufenen Passwort auf der Website surfen.

Hier ist ein Beitrag, den ich zu diesem Thema verfasst habe, mit einigen Bonuspunkten:

Filterattribut "Benutzerkennwort abgelaufen" in ASP.NET MVC

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X