Членство Создать пароль буквенно-цифровой только пароль? - PullRequest
33 голосов
/ 13 апреля 2010

Как я могу использовать Membership.GeneratePassword для возврата пароля, который содержит ТОЛЬКО буквенные или цифровые символы? Метод по умолчанию гарантирует только минимальное, а не максимальное количество не буквенно-цифровых паролей.

Ответы [ 7 ]

55 голосов
/ 13 апреля 2010
string newPassword = Membership.GeneratePassword(15, 0);
newPassword = Regex.Replace(newPassword, @"[^a-zA-Z0-9]", m => "9" );

Это регулярное выражение заменит все не алфавитно-цифровые символы числовыми символами 9.

15 голосов
/ 22 сентября 2010

Простой способ получить 8-значный буквенно-цифровой пароль состоит в том, чтобы сгенерировать guid и использовать его в качестве основы:

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

Если вам нужен более длинный пароль, просто пропустите тире, используя подстроки:

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

Если вы хотите убедиться, что первый символ является альфа, вы можете просто заменить его при необходимости на фиксированную строку, если (newPwd [0]> = '0' && newPwd [0] <= '9') .. . </p>

Я надеюсь, что кто-то может найти это полезным. : -)

13 голосов
/ 29 мая 2013

Я понял, что могут быть способы сделать это. Метод GUID хорош, за исключением того, что он не смешивает верхний и нижний регистры алфавитов. В моем случае он выдает только строчные буквы.

Поэтому я решил использовать Regex, чтобы удалить не-альфы, а затем подставить результаты в нужную мне длину.

string newPassword = Membership.GeneratePassword(50, 0); 

newPassword = Regex.Replace(newPassword, @"[^a-zA-Z0-9]", m => ""); 

newPassword = newPassword.Substring(0, 10);
1 голос
/ 13 сентября 2016

Вы также можете попытаться сгенерировать пароли и объединить не буквенно-цифровые символы, пока не достигнете желаемой длины пароля.

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 голосов
/ 17 апреля 2018

Исходя из ответа @ SollyM, поместив вокруг него цикл while, чтобы предотвратить очень маловероятное событие для всех символов или слишком большого количества символов, являющихся специальными символами, а затем подстроку, вызывающую исключение.

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 голосов
/ 17 апреля 2017

Существует аналогичный подход с решением Брайго. Может быть, это не так эффективно, но так ясно и коротко

string GeneratePassword(int length)
{
     var password = "";
     while (password.Length < length)
     {
          password += string.Concat(Membership.GeneratePassword(1, 0).Where(char.IsLetterOrDigit));
     }
     return password;
}
0 голосов
/ 27 апреля 2011

Я также предпочитаю метод GUID - вот короткая версия:

string password = Guid.NewGuid().ToString("N").Substring(0, 8);
...