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.
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.
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. : -)
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);
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();
}
je préfère aussi le GUID de la méthode, voici la version courte:
string password = Guid.NewGuid().ToString("N").Substring(0, 8);
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;
}
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);
}