Wie kann ich mit Membership.GeneratePassword ein Passwort zurückgeben, das NUR alphanumerische Zeichen enthält? Die Standardmethode garantiert nur eine minimale und nicht eine maximale Anzahl von nicht alphanumerischen Passwörtern.Mitgliedschaft Passwort generieren Passwort nur alphanumerisch?
Antwort
string newPassword = Membership.GeneratePassword(15, 0);
newPassword = Regex.Replace(newPassword, @"[^a-zA-Z0-9]", m => "9");
Dieser reguläre Ausdruck wird alle nicht alphanumerische Zeichen mit dem numerischen Zeichen 9.
Dies wird eine Menge Zufälligkeit in Ihrem Passwort verlieren. Nicht empfohlen. –
@ Matti Möglich, die "9" durch Random.Next (0, 9) Integer zu ersetzen. Das Platzieren von nicht alphanumerischen Zeichen in einem typischen Kennwort ist normalerweise übertrieben. Ein zufällig generiertes Passwort, das keine Wörter verwendet, ist für viele Anwendungen in Ordnung. Der Grund dafür ist die Benutzerfreundlichkeit. Viele nicht alphanumerische Zeichen sind leicht zu verwechseln oder können vom Durchschnittsbenutzer nicht eingegeben werden. –
@ Matti Es ist auch möglich, mit diesem Code zurückzugehen und nur eine Teilmenge genehmigter nicht-alphanumerischer Zeichen einzufügen. Ich sehe jedoch keine Notwendigkeit für viele Anwendungen. –
Eine einfache Art und Weise ein 8-stellige alphanumerisches Passwort zu erhalten wäre ersetzt eine GUID und zu verwenden, die als Basis zu generieren:
string newPwd = Guid.NewGuid().ToString().Substring(0, 8);
Wenn Sie ein längeres Passwort benötigen, überspringen Sie einfach über den Strich Teil mit:
string newPwd = Guid.NewGuid().ToString().Substring(0, 11);
newPwd = newPwd.Substring(0, 8) + newPwd.Substring(9, 2); // to skip the dash.
Wenn Sie sicherstellen möchten, dass das erste Zeichen Alpha ist, können Sie es bei Bedarf durch eine feste Zeichenfolge ersetzen if (newPwd [0]> = '0' & & newPwd [0] < = '9') ..
Ich hoffe jemand kann das hilfreich finden.
:-)Dies ist keine gute Idee. Zum einen reduzierst du deine Menge möglicher Charaktere auf 16 (statt 36); Zum anderen sind Guids nicht unbedingt zufällig, und abhängig von der Methode, mit der die guid erzeugt wird, sind die Passwörter, die Sie erstellen, leicht vorhersehbar. Ich empfehle Eric Lipperts Serie darüber, wie Guids für mehr Informationen darüber arbeiten: http://blogs.msdn.com/b/ericlippert/archive/2012/04/24/guid-guide-part-one.aspx –
Ich ziehe auch die GUID-Methode - hier ist die kurze Version:
string password = Guid.NewGuid().ToString("N").Substring(0, 8);
Wirksam die Genau die gleiche Antwort wie bei Laura, mit einem string-Format, das ohne Grund angegeben wurde (hat keinen Effekt). –
Ich erkennen, dass es Möglichkeiten sein kann, dies zu tun. Die GUID-Methode ist großartig, außer dass sie Groß- und Kleinbuchstaben nicht miteinander vermischt. In meinem Fall produzierte es nur Kleinbuchstaben.
Also entschied ich mich, die Regex zu verwenden, um die Nicht-Alphas zu entfernen und dann die Ergebnisse auf die von mir benötigte Länge zu substringieren.
string newPassword = Membership.GeneratePassword(50, 0);
newPassword = Regex.Replace(newPassword, @"[^a-zA-Z0-9]", m => "");
newPassword = newPassword.Substring(0, 10);
Danke, ich habe es in meinem Projekt verwendet –
Obwohl unwahrscheinlich, ist es möglich, dass das ursprüngliche Passwort weniger als 10 alphanumerische Zeichen enthalten könnte, die dann in ArgumentOutOfRangeException() durch die Substring() -Methode ausgelöst würde. – Chris
Ich bitte @ Chris zu unterscheiden. Die 50 in 'Membership.GeneratePassword' gibt die Länge des Passwortes an, nicht nur die' MaxLength'. – SollyM
Sie könnten auch versuchen, Passwörter zu erzeugen und die nicht alphanumerischen Zeichen verketten, bis Sie das gewünschte Passwort Länge erreichen.
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();
}
Es gibt ähnliche Ansatz mit Breigo-Lösung. Vielleicht ist das nicht so effektiv, aber so klar und kurz
string GeneratePassword(int length)
{
var password = "";
while (password.Length < length)
{
password += string.Concat(Membership.GeneratePassword(1, 0).Where(char.IsLetterOrDigit));
}
return password;
}
Warum möchten Sie dies tun? Sonderzeichen sind eine gute Sache in Ihrem Passwort. Wenn Sie (aus irgendeinem seltsamen Grund, den Sie nicht verstehen) einen wirklich wollen, schreiben Sie Ihre eigene Methode, um sie zu generieren, und verwenden Sie nicht GeneratePassword. –
Ein Grund ist, dass diese erzeugten Passwörter nicht wirklich globalisierungsfreundlich sind. Ein weiterer Grund ist, dass der CEO, der die Anwendung verwendet, sauer auf das hässliche, aber sicher generierte Passwort wurde und sagte, dass Sie es ändern. – Greg
Oder in meinem Fall verursachen die Interpunktionszeichen einen Serverfehler in der API, die ich rufe. – Drew