2016-04-11 18 views
1

Ich baue ein System mit Sitecore 7.5 und ich möchte herausfinden, wie ein Sitecore-Benutzer sein Passwort bei der nächsten Anmeldung ändern kann. Wir haben ein benutzerdefiniertes Profil, das alle Benutzer haben, und ich habe ein Kontrollkästchen namens "Passwort ändern erforderlich" hinzugefügt. Und ich habe den Code unten zur LoggingIn-Pipeline hinzugefügt. Auf diese Weise kann ein Benutzer, wenn er sich anmeldet, einfach auf die eingebaute Sitecore-Passwort-Seite umleiten.Wie kann der Sitecore-Benutzer das Passwort bei der nächsten Anmeldung ändern?

public class PasswordChange 
{ 
    public void Process(LoggingInArgs args) 
    { 
     var user = Sitecore.Security.Accounts.User.FromName(args.Username, true); 
     var myCustomUser = new CustomUser(user.Profile); 
     if (myCustomUser.PasswordChangeRequired) 
     { 
      HttpContext.Current.Response.Redirect("/sitecore/login/changepassword.aspx"); 
     } 
    } 
} 

Das funktioniert gut. Wenn ich in den Benutzer-Manager gehe und das Kontrollkästchen für einen bestimmten Benutzer ankreuze, werden sie beim nächsten Login-Versuch auf die eingebaute Sitecore-Seite umgeleitet, um Ihr Passwort zu ändern. Allerdings kann ich nicht herausfinden, wann ich dieses Kontrollkästchen in ihrem Benutzerprofil deaktivieren kann. Idealerweise möchte ich Code haben, der ausgeführt wird, nachdem der Benutzer sein Passwort geändert hat. Dieser Code sollte das Kontrollkästchen deaktivieren, damit das Kennwort beim nächsten Anmelden nicht geändert werden muss.

Weiß jemand, ob es irgendwie möglich ist, sich an die eingebaute Sitecore-Passwortänderung anzuknüpfen, damit ich Code ausführen kann, nachdem der Benutzer sein Passwort erfolgreich geändert und das Kontrollkästchen in seinem Benutzerprofil deaktiviert hat?

Oder gibt es einen besseren Weg, dies zu erreichen?

Danke, Corey

UPDATE: Hinzufügen von Code, dass ich das Problem zu lösen verwendet. Ich habe den Benutzer verwendet: aktualisiertes Ereignis wie von Anton unten vorgeschlagen. Ich entschied, dass, wenn das Passwort des Benutzers in den letzten 30 Sekunden geändert wurde, das bedeutete, dass es in Ordnung war, das Kontrollkästchen zu deaktivieren.

public class UserUpdatedHandler 
{ 
    protected void HandleUserUpdate(object sender, EventArgs args) 
    { 
     var user = (MembershipUserWrapper)Event.ExtractParameter(args, 0); 
     if (user != null) 
     { 
      // If this change was a password change and the Password Change Required checkbox is checked, 
      // then uncheck the Password Change Required checkbox 

      //First get a membership user object 
      var membershipUser = Membership.GetUser(user.UserName); 
      if (membershipUser != null) 
      { 
       //Now check the elapsed time since the last password change 
       var elapsedTimeSinceLastPasswordChange = DateTime.Now - membershipUser.LastPasswordChangedDate; 
       if (elapsedTimeSinceLastPasswordChange.TotalSeconds < 30) 
       { 
        //Get a Sitecore User 
        var sitecoreUser = User.FromName(user.UserName, true); 
        if (sitecoreUser != null) 
        { 
         //Create a custom user 
         var customUser = new CustomUser(sitecoreUser.Profile); 
         if (customUser.PasswordChangeRequired) 
         { 
          customUser.PasswordChangeRequired = false; 
          customUser.Save(); 
         } 
        } 
       } 
      } 
     } 
    } 
} 

Antwort

2

Es ist ein Ereignis, das nach dem Benutzerwechsel ausgelöst werden soll (ich glaube, dass Passwort zu ändern dieses Ereignis auslösen): „user: aktualisiert“. Innerhalb des Ereignishandlers können Sie die Benutzereigenschaft "LastPasswordChangedDate" überprüfen und feststellen, ob es sich um eine Passwortänderung oder eine andere Änderung der Benutzeraktion handelt. Wenn das Kennwort geändert wird, können Sie das Kontrollkästchen im Benutzerprofil deaktivieren.

+0

Das hat geklappt! Vielen Dank. Ich werde die Frage mit dem Code aktualisieren, mit dem ich das Problem gelöst habe. –

0

Im ersten Schritt erstellen Sie ein benutzerdefiniertes Profil, in dem Sie eine Eigenschaft namens isFirstTime hinzufügen.

Sie Ihren eigenen Prozessor als erster Prozessor von loggingin Pipeline hinzufügen:

public void Process(LoggingInArgs args) 
{ 
MembershipUser user = Membership.GetUser(args.Username); 
if (user != null) 
    { 
    if (user.Profile["isFirstTime"].Equals("1")) 
    { 
     HttpContext.Current.Response.Redirect("/passwordchangepage"); 
    } 
    } 
} 

Diese alle Benutzer umleitet, das Passwort zu ändern URL zum/passwordchangepage erfordern. Auf dieser Seite erstellen Sie ein Formular für altes Passwort und neues Passwort und eine Absenden-Schaltfläche.

Auf Absenden des Formulars Kennwortänderung durchführen:

MembershipUser user = Membership.GetUser(username); 
user.ChangePassword(oldPassword, newPassword); 
user.Profile["isFirstTime"]=false; 
+0

Ja, ich habe diesen Post irgendwo anders im Web gesehen. Ich hatte gehofft zu vermeiden, dass ich meine eigene Seite zum Ändern des Passwortes erstellen musste. Ich hatte gehofft, dass ich einfach die eingebaute Sitecore-Passwortänderungsseite verwenden könnte, die bereits existiert. –