Mot de passe généré mot de passe alphanumérique seulement mot de passe?

Comment puis-je utiliser L'adhésion.GeneratePassword pour retourner un mot de passe qui ne contient que des caractères alphanumériques? La méthode par défaut ne garantit qu'un nombre minimal et non un nombre maximal de mots de passe non alphanumériques.

32
demandé sur Kyle Trauberman 2010-04-13 00:21:40

7 réponses

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

cette expression régulière remplacera tous les caractères non alphanumériques par le caractère numérique 9.

53
répondu Curtis White 2010-04-12 20:23:30

une façon simple d'obtenir un mot de passe alphanumérique à 8 caractères serait de générer un guid et de l'utiliser comme base:

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

si vous avez besoin d'un mot de passe plus long, sautez simplement sur le tableau de bord en utilisant les soustractions:

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

si vous voulez vous assurer que le premier caractère est alpha, vous pouvez simplement le remplacer au besoin par une chaîne fixe si (newPwd[0] >= '0' && newPwd[0] <= '9')...

j'espère que quelqu'un peut trouver cela utile. : -)

13
répondu Laura Blood 2010-09-21 21:09:36

j'ai réalisé qu'il peut y avoir des façons de le faire. La méthode GUID est excellente, sauf qu'elle ne mélange pas les alphabets majuscules et minuscules. Dans mon cas, il ne produisait que des minuscules.

J'ai donc décidé d'utiliser le Regex pour supprimer les non-alphas puis de mettre les résultats en sous-couche à la longueur dont j'avais besoin.

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

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

newPassword = newPassword.Substring(0, 10);
13
répondu SollyM 2013-05-29 12:01:23

Vous pouvez également essayer de générer des mots de passe et concaténer les caractères non alphanumériques jusqu'à ce que vous atteigniez la longueur de mot de passe désirée.

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();
}
1
répondu breigo 2016-09-13 09:51:08

je préfère aussi le GUID de la méthode, voici la version courte:

string password = Guid.NewGuid().ToString("N").Substring(0, 8);
0
répondu Miro Grenda 2011-04-27 10:49:46

il y a une approche similaire avec la solution de breigo. Peut-être que ce n'est pas aussi efficace, mais si clair et court

string GeneratePassword(int length)
{
     var password = "";
     while (password.Length < length)
     {
          password += string.Concat(Membership.GeneratePassword(1, 0).Where(char.IsLetterOrDigit));
     }
     return password;
}
0
répondu AntonE 2017-04-17 13:47:01

aller de la réponse de @SollyM, mettre une boucle de temps autour de lui, pour empêcher l'événement très improbable de tous les caractères, ou trop de caractères étant des caractères spéciaux, et puis soustraire jeter une 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
répondu Djensen 2018-04-18 08:28:03