6

Gibt es eine Alternative zu System.Web.Security.Membership.GeneratePassword in AspNetCore (netcoreapp1.0).Alternative zu System.Web.Security.Membership.GeneratePassword in aspnetcore (netcoreapp1.0)

Der einfachste Weg wäre, einfach eine Guid.NewGuid().ToString("n") zu verwenden, die lang genug ist, um ein Passwort zu verdienen, aber es ist nicht völlig zufällig.

+0

Was macht 'System.Web.Security.Membership.GeneratePassword', was Sie nicht wollen? – bsoulier

+1

All diese Methode ist [generieren Sie ein zufälliges Passwort] (https://msdn.microsoft.com/en-us/library/system.web.security.membership.generatepassword (v = vs.110) .aspx), das super einfach selbst zu machen. – DavidG

Antwort

20

Hier ist eine Klasse/Methode, basierend auf der Quelle des Membership.GeneratePassword davon auf .NET-Core funktioniert:

public static class Password 
{ 
    private static readonly char[] Punctuations = "[email protected]#$%^&*()_-+=[{]};:>|./?".ToCharArray(); 

    public static string Generate(int length, int numberOfNonAlphanumericCharacters) 
    { 
     if (length < 1 || length > 128) 
     { 
      throw new ArgumentException(nameof(length)); 
     } 

     if (numberOfNonAlphanumericCharacters > length || numberOfNonAlphanumericCharacters < 0) 
     { 
      throw new ArgumentException(nameof(numberOfNonAlphanumericCharacters)); 
     } 

     using (var rng = RandomNumberGenerator.Create()) 
     { 
      var byteBuffer = new byte[length]; 

      rng.GetBytes(byteBuffer); 

      var count = 0; 
      var characterBuffer = new char[length]; 

      for (var iter = 0; iter < length; iter++) 
      { 
       var i = byteBuffer[iter] % 87; 

       if (i < 10) 
       { 
        characterBuffer[iter] = (char)('0' + i); 
       } 
       else if (i < 36) 
       { 
        characterBuffer[iter] = (char)('A' + i - 10); 
       } 
       else if (i < 62) 
       { 
        characterBuffer[iter] = (char)('a' + i - 36); 
       } 
       else 
       { 
        characterBuffer[iter] = Punctuations[i - 62]; 
        count++; 
       } 
      } 

      if (count >= numberOfNonAlphanumericCharacters) 
      { 
       return new string(characterBuffer); 
      } 

      int j; 
      var rand = new Random(); 

      for (j = 0; j < numberOfNonAlphanumericCharacters - count; j++) 
      { 
       int k; 
       do 
       { 
        k = rand.Next(0, length); 
       } 
       while (!char.IsLetterOrDigit(characterBuffer[k])); 

       characterBuffer[k] = Punctuations[rand.Next(0, Punctuations.Length)]; 
      } 

      return new string(characterBuffer); 
     } 
    } 
} 

ich die do...while Schleife über die CrossSiteScriptingValidation.IsDangerousString weggelassen habe. Sie können das in sich selbst hinzufügen, wenn Sie es brauchen.

Sie verwenden es wie folgt aus:

var password = Password.Generate(32, 12); 

Stellen Sie außerdem sicher, dass Sie verweisen "System.Security.Cryptography.Algorithms": "4.2.0".

+0

Das ist so hilfreich. Vielen Dank. –

+0

Jeder NuGet, der diesen Code enthält? –

+0

Nicht, dass ich weiß ... – khellang