6

是否有任何替代System.Web.Security.Membership.GeneratePasswordAspNetCorenetcoreapp1.0)。aspnetcore(netcoreapp1.0)中的System.Web.Security.Membership.GeneratePassword的替代方法

最簡單的方法是使用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