Membership Generate Password alphanumeric only password?

前端 未结 7 2083
独厮守ぢ
独厮守ぢ 2020-12-28 13:11

How can I use Membership.GeneratePassword to return a password that ONLY contains alpha or numeric characters? The default method will only guarantee a minimum and not a max

相关标签:
7条回答
  • 2020-12-28 13:16
    string newPassword = Membership.GeneratePassword(15, 0);
    newPassword = Regex.Replace(newPassword, @"[^a-zA-Z0-9]", m => "9" );
    

    This regular expression will replace all non alphanumeric characters with the numeric character 9.

    0 讨论(0)
  • 2020-12-28 13:26

    A simple way to get an 8 character alphanumeric password would be to generate a guid and use that as the basis:

    string newPwd = Guid.NewGuid().ToString().Substring(0, 8);
    

    If you need a longer password, just skip over the dash using substrings:

    string newPwd = Guid.NewGuid().ToString().Substring(0, 11);
    newPwd = newPwd.Substring(0, 8) + newPwd.Substring(9, 2); // to skip the dash.
    

    If you want to make sure the first character is alpha, you could just replace it when needed with a fixed string if (newPwd[0] >= '0' && newPwd[0] <= '9')...

    I hope someone can find this helpful. :-)

    0 讨论(0)
  • 2020-12-28 13:32

    Going from @SollyM's answer, putting a while loop around it, to prevent the very unlikely event of all characters, or too many characters being special characters, and then substring throwing an exception.

    private string GetAlphaNumericRandomString(int length)
    {
        string randomString = "";
        while (randomString.Length < length)
        {
          //generates a random string, of twice the length specified, to counter the 
          //probability of the while loop having to run a second time
          randomString += Membership.GeneratePassword(length * 2, 0);
    
          //replace non alphanumeric characters
          randomString = Regex.Replace(randomString, @"[^a-zA-Z0-9]", m => "");
        }
        return randomString.Substring(0, length);
    }
    
    0 讨论(0)
  • 2020-12-28 13:35

    You could also try to generate passwords and concatenate the non alphanumeric characters until you reach the desired password length.

    public string GeneratePassword(int length)
    {
        var sb = new StringBuilder(length);
    
        while (sb.Length < length)
        {
            var tmp = System.Web.Security.Membership.GeneratePassword(length, 0);
    
            foreach(var c in tmp)
            {
                if(char.IsLetterOrDigit(c))
                {
                    sb.Append(c);
    
                    if (sb.Length == length)
                    {
                        break;
                    }
                }
            }
        }
    
        return sb.ToString();
    }
    
    0 讨论(0)
  • 2020-12-28 13:35

    There is similar approach with breigo's solution. Maybe this is not so effective but so clear and short

    string GeneratePassword(int length)
    {
         var password = "";
         while (password.Length < length)
         {
              password += string.Concat(Membership.GeneratePassword(1, 0).Where(char.IsLetterOrDigit));
         }
         return password;
    }
    
    0 讨论(0)
  • 2020-12-28 13:37

    I realised that there may be ways of doing this. The GUID method is great, except it doesn't mix UPPER and lower case alphabets. In my case it produced lower-case only.

    So I decided to use the Regex to remove the non-alphas then substring the results to the length that I needed.

    string newPassword = Membership.GeneratePassword(50, 0); 
    
    newPassword = Regex.Replace(newPassword, @"[^a-zA-Z0-9]", m => ""); 
    
    newPassword = newPassword.Substring(0, 10);
    
    0 讨论(0)
提交回复
热议问题