Membership.GeneratePasswordを使用して、英数字のみを含むパスワードを返すにはどうすればよいですか?デフォルトの方法では、英数字以外のパスワードの最大数ではなく最小数のみが保証されます。
string newPassword = Membership.GeneratePassword(15, 0);
newPassword = Regex.Replace(newPassword, @"[^a-zA-Z0-9]", m => "9" );
この正規表現は、英数字以外のすべての文字を数字9に置き換えます。
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')...
私は誰かがこれが役立つと思うことを望みます。 :-)
私にはこれを行う方法があるかもしれないことに気づきました。 GUIDメソッドは素晴らしいですが、大文字と小文字のアルファベットを混在させないことを除けば、私の場合は小文字しか生成しませんでした。
そこで、正規表現を使用して非アルファを削除し、結果を必要な長さにサブストリング化することにしました。
string newPassword = Membership.GeneratePassword(50, 0);
newPassword = Regex.Replace(newPassword, @"[^a-zA-Z0-9]", m => "");
newPassword = newPassword.Substring(0, 10);
また、パスワードを生成して、目的のパスワード長に達するまで英数字以外の文字を連結することもできます。
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();
}
@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);
}
Breigoのソリューションにも同様のアプローチがあります。多分これはそれほど効果的ではありませんが、とても明確で短いです
string GeneratePassword(int length)
{
var password = "";
while (password.Length < length)
{
password += string.Concat(Membership.GeneratePassword(1, 0).Where(char.IsLetterOrDigit));
}
return password;
}
私もGUIDメソッドを好む-ここに短いバージョンがあります:
string password = Guid.NewGuid().ToString("N").Substring(0, 8);