2008-12-08 27 views
21

Ich benutze ASP.NET-Mitgliedschaft für die Authentifizierung meiner Web-App. Das hat super für mich funktioniert. Ich muss jetzt den Passwortablauf implementieren.ASP.NET Mitgliedschaft Passwort Ablauf

Wenn das Passwort abgelaufen ist, sollte der Benutzer auf den Bildschirm ChangePassword umgeleitet werden und darf keinen Zugriff auf andere Teile der Anwendung haben, ohne das Passwort zu ändern.

Es gibt viele ASPX-Seiten. Eine Lösung könnte darin bestehen, zu dem -Bildschirm OnInit jedes Aspx umzuleiten, wenn das Passwort abgelaufen ist. Gibt es andere Lösungen oder Empfehlungen?

Danke, Jai

Antwort

13

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

+6

Das ist, was ich tun würde, kombiniert mit der LastPasswordChangedDate Eigenschaft des Mitgliedschaftsanbieters verwenden, um zu bestimmen, wenn es abläuft. – technophile

6

Nur in einer Stunde implementiert, keine Notwendigkeit, Ihre Basis-Seite zu ändern. Heres, was Sie tun müssen:

  1. Respond zum LoggingIn Ereignisse der Mitgliedschaft Steuer

  2. die Benutzer in der Mitgliederdatenbank finden und LastPasswordChangedDate

  3. Mit einer Zeitspanne zu erhalten, vergleichen Sie diese mit das aktuelle Datum und entscheiden, ob das Passwort zuletzt mehr als die erforderliche Anzahl von Tagen geändert wurde. Ich erhalte diesen Wert von web.config

  4. Wenn abgelaufen, Umleitung auf den ChangePassword Bildschirm

+1

Dies wird keine Benutzer mit einem vorhandenen Authentifizierungsticket ("merke mich") abfangen. csgeros Lösung ist korrekt. – Brett

+0

Ja, wenn sie derzeit authentifiziert sind, würde ich sagen, dass das kein großes Problem ist, es sei denn, Sie machen Ihre Cookies bis ins Unendliche gültig. Wenn Sie feststellen, dass sie bereits angemeldet und abgelaufen sind, setzen Sie das Cookie so, dass es in etwa 20 Minuten abläuft. Dann, wenn sie zurückkommen, werden sie es ändern müssen. –

+1

Das Problem beim Einchecken von PostAuth ist auch eine Menge zusätzlicher Systemaktivität für jede einzelne Anfrage. Solange Ihre Tickets ziemlich oft ablaufen, sollte es kein großes Problem geben ODER Sie lassen den PostAuth-Code einfach einen Tag länger als Ihre Timeout-Zeit laufen. Dies stellt sicher, dass jeder, der die Website mit einem gültigen Formularauthentifizierungsticket besucht, überprüft wird. Wenn sie sich dann während dieser Zeit überhaupt nicht anmelden, verfallen die Formulare Auth-Tickets und LogginIn kann sogar verwendet werden. Nach einem Tag nach Ablauf der Ticket-Ablaufzeit können Sie das PostAuth-Ereignis entfernen. Außerdem sollten Sie nach der Anmeldung –

26

Zusätzlich zu csgero's answer, fand ich, dass Sie nicht brauchen, explizit einen Event-Handler für dieses Ereignis hinzuzufügen in ASP.Net 2.0 (3.5).

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

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

Große Antwort und Beispielcode. Vielen Dank! – joshschreuder

+0

Bitte beachten Sie das unten stehende Fix von Ben Rethmeier (http://stackoverflow.com/a/9879682/324817), damit Sie das Passwort auf dem Bildschirm zum Ändern des Passworts ändern können. – joshschreuder

+0

Danke @shrodes - Ich habe meine Antwort auf Ben Rethmeiers Update aktualisiert: o) – Andrew

9

Zusätzlich zu Andrew's answer, fand ich Sie überprüfen müssen, dass der Benutzer auf der Seite Kennwort ändern nicht bereits geschehen ist, oder sie werden nie in der Lage sein, tatsächlich ihr Passwort zu ändern, und daher nie das Passwort ändern Seite verlassen:

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

+1: guter Punkt Ben: o) – Andrew

4

ich hier habe für eine Lösung dieses Problems suchen, aber meine aktuellen Stand der Technik ist ASP.NET MVC. So, anderen zu helfen: Sie können die AuthorizeAttribute erweitern können, und außer Kraft setzen OnAuthorization Methode, wie folgt aus:

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

Hinweis: Ich verwende T4MVC Controller und Action-Namen in dem 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 habe ich mit einigen Bonuspunkte auf dem Thema haben:

User Password Expired filter attribute in ASP.NET MVC

0

ich verwendet, um den Code von oben und nur etwas in Asp.NET (4.5) MVC5 mit der zur Umsetzung modifiziert. NET-Identitätsanbieter so dass es gerade hier für den nächsten Mann/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(); 
     } 
    } 
Verwandte Themen