2013-10-30 3 views
18

Ich habe einen MVC 4-Standort, der derzeit SimpleMembership implementiert. In der nächsten Iteration der Website möchte ich Upgrade auf MVC 5 und ASP.NET Identity. Beide Websites haben in web.config den gleichen Computerschlüssel. Die SimpleMembership SQL-Tabellen haben eine Spalte für PasswortundPaswordSalt die ASP.NET Identitäts Tabellen haben eine Spalte für PasswordHash die eine Kombination aus Passwort + PasswordSalt zu sein scheint.Vorhandene Benutzer von MVC 4 SimpleMembership in MVC 5 migrieren ASP.NET Identity

Ich versuchte, das Passwort und PasswordSlat zusammen aus der alten Seite verketten, aber das funktioniert nicht.

Meine Frage ist,

wie migriere ich meine vorhandenen Benutzer-Passwörter von der alten Website auf die neue Website?

+2

Es gibt ein Tutorial [hier] (http://kevin-junghans.blogspot.com/2014/02/migrating-existing-website-from.html). – JonasCz

+0

Und dies hier http://www.asp.net/identity/overview/migrations/migrating-an- existing-website-from-sql-membership-to-aspnet-identity – Bellash

Antwort

1

Nach http://www.asp.net/identity/overview/migrations/migrating-an-existing-website-from-sql-membership-to-aspnet-identity:

Die Passwörter der Nutzer der Anwendung werden in der Datenbank verschlüsselt und gespeichert. Der Crypto-Algorithmus, der bei der SQL-Mitgliedschaft verwendet wird, unterscheidet sich von dem im neuen Identity-System. Um alte Passwörter wiederzuverwenden, müssen Passwörter selektiv entschlüsselt werden, wenn sich alte Benutzer mit dem SQL-Mitgliedschaftsalgorithmus anmelden, während der Crypto-Algorithmus in Identity für die neuen Benutzer verwendet wird.

Die UserManager-Klasse besitzt eine Eigenschaft 'PasswordHasher', die eine Instanz einer Klasse speichert, die die 'IPasswordHasher'-Schnittstelle implementiert. Dies wird verwendet, um Passwörter während Benutzerauthentifizierungstransaktionen zu verschlüsseln/entschlüsseln. Erstellen Sie in der UserManager-Klasse, die in Schritt 3 definiert wird, eine neue Klasse SQLPasswordHasher, und kopieren Sie den folgenden Code.

So müssen Sie mit dem Folowing Code neue Hasher Klasse erstellen:

public class SQLPasswordHasher : PasswordHasher 
    { 
    public override string HashPassword(string password) 
    { 
     return base.HashPassword(password); 
    } 

public override PasswordVerificationResult VerifyHashedPassword(string hashedPassword, string providedPassword) 
    { 
     string[] passwordProperties = hashedPassword.Split('|'); 
     if (passwordProperties.Length != 3) 
     { 
      return base.VerifyHashedPassword(hashedPassword, providedPassword); 
     } 
     else 
     { 
      string passwordHash = passwordProperties[0]; 
      int passwordformat = 1; 
      string salt = passwordProperties[2]; 
      if (String.Equals(EncryptPassword(providedPassword, passwordformat, salt), passwordHash, StringComparison.CurrentCultureIgnoreCase)) 
      { 
       return PasswordVerificationResult.SuccessRehashNeeded; 
      } 
      else 
      { 
       return PasswordVerificationResult.Failed; 
      } 
     } 
    } 

//This is copied from the existing SQL providers and is provided only for back-compat. 
    private string EncryptPassword(string pass, int passwordFormat, string salt) 
    { 
     if (passwordFormat == 0) // MembershipPasswordFormat.Clear 
      return pass; 

     byte[] bIn = Encoding.Unicode.GetBytes(pass); 
     byte[] bSalt = Convert.FromBase64String(salt); 
     byte[] bRet = null; 

     if (passwordFormat == 1) 
     { // MembershipPasswordFormat.Hashed 
      HashAlgorithm hm = HashAlgorithm.Create("SHA1"); 
      if (hm is KeyedHashAlgorithm) 
      { 
       KeyedHashAlgorithm kha = (KeyedHashAlgorithm)hm; 
       if (kha.Key.Length == bSalt.Length) 
       { 
        kha.Key = bSalt; 
       } 
       else if (kha.Key.Length < bSalt.Length) 
       { 
        byte[] bKey = new byte[kha.Key.Length]; 
        Buffer.BlockCopy(bSalt, 0, bKey, 0, bKey.Length); 
        kha.Key = bKey; 
       } 
       else 
       { 
        byte[] bKey = new byte[kha.Key.Length]; 
        for (int iter = 0; iter < bKey.Length;) 
        { 
         int len = Math.Min(bSalt.Length, bKey.Length - iter); 
         Buffer.BlockCopy(bSalt, 0, bKey, iter, len); 
         iter += len; 
        } 
        kha.Key = bKey; 
       } 
       bRet = kha.ComputeHash(bIn); 
      } 
      else 
      { 
       byte[] bAll = new byte[bSalt.Length + bIn.Length]; 
       Buffer.BlockCopy(bSalt, 0, bAll, 0, bSalt.Length); 
       Buffer.BlockCopy(bIn, 0, bAll, bSalt.Length, bIn.Length); 
       bRet = hm.ComputeHash(bAll); 
      } 
     } 

     return Convert.ToBase64String(bRet); 
    } 

erklären Dann in Ihrer Klasse Identität Usermanager eine contructor diesen Hasher zu verwenden, zum Beispiel:

public UserManager() 
     : base(new UserStore<User>(new ApplicationDbContext())) 
    { 
     this.PasswordHasher = new SQLPasswordHasher(); 
} 
0

Es wird in dem folgenden Link angegeben: http://kevin-junghans.blogspot.com/2014/02/migrating-existing-website-from.html

public class SimplePasswordHasher : IPasswordHasher 
    { 
    public string HashPassword(string password) 
    { 
     return Crypto.HashPassword(password); 
    } 
    public PasswordVerificationResult VerifyHashedPassword(string hashedPassword, string providedPassword) 
    { 
     if(Crypto.VerifyHashedPassword(hashedPassword, providedPassword)) 
     return PasswordVerificationResult.Success; 
     else return PasswordVerificationResult.Failed; 
     } 
    }