6

Есть ли альтернатива System.Web.Security.Membership.GeneratePassword в AspNetCore (netcoreapp1.0).Альтернатива System.Web.Security.Membership.GeneratePassword в aspnetcore (netcoreapp1.0)

Самый простой способ - просто использовать Guid.NewGuid().ToString("n"), который достаточно длинный, чтобы быть достойным пароля, но он не является полностью случайным.

+0

Что делает 'System.Web.Security.Membership.GeneratePassword' делать то, что вам не нужно? – bsoulier

+1

Все, что делает этот метод, это [сгенерировать случайный пароль] (https://msdn.microsoft.com/en-us/library/system.web.security.membership.generatepassword (v = vs.110) .aspx), что супер легко сделать сам. – DavidG

ответ

20

Вот класс/метод, основанный на источнике Membership.GeneratePassword того работает на .NET Ядра:

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

я опустил do...while петлю над CrossSiteScriptingValidation.IsDangerousString. Вы можете добавить это обратно в себя, если вам это нужно.

Вы можете использовать его как это:

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

Кроме того, убедитесь, что вы ссылаетесь "System.Security.Cryptography.Algorithms": "4.2.0".

+0

Это так полезно. Спасибо. –

+0

Любой NuGet, который содержит этот код? –

+0

Не то, что я знаю ... – khellang