Comment puis-je utiliser Membership.GeneratePassword pour renvoyer un mot de passe qui contient UNIQUEMENT des caractères alphanumériques? La méthode par défaut ne garantira qu'un nombre minimum et non maximum de mots de passe non alphanumériques.
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.
Un moyen simple d'obtenir un mot de passe alphanumérique à 8 caractères serait de générer un guide 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, ignorez simplement le tiret en utilisant des sous-chaînes:
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 si nécessaire par une chaîne fixe if (newPwd [0]> = '0' && newPwd [0] <= '9') ...
J'espère que quelqu'un pourra trouver cela utile. :-)
J'ai réalisé qu'il pouvait y avoir des moyens de faire cela. La méthode GUID est excellente, sauf qu'elle ne mélange pas les alphabets MAJUSCULES et minuscules. Dans mon cas, elle n'a produit que des minuscules.
J'ai donc décidé d'utiliser le Regex pour supprimer les non-alphas, puis sous-transmettre les résultats à 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);
Vous pouvez également essayer de générer des mots de passe et de concaténer les caractères non alphanumériques jusqu'à ce que vous atteigniez la longueur de mot de passe souhaité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();
}
En partant de la réponse de @ SollyM, en mettant une boucle while autour d'elle, pour éviter l'événement très improbable de tous les caractères, ou trop de caractères étant des caractères spéciaux, puis sous-chaîne lançant 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);
}
Il existe une approche similaire avec la solution de breigo. Peut-être que ce n'est pas si 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;
}
Je préfère aussi la méthode GUID - voici la version courte:
string password = Guid.NewGuid().ToString("N").Substring(0, 8);