如何使用Membership.GeneratePassword返回仅包含字母或数字字符的密码?默认方法仅保证最小数量而非最大数量的非字母数字密码。
答案 0 :(得分:55)
string newPassword = Membership.GeneratePassword(15, 0);
newPassword = Regex.Replace(newPassword, @"[^a-zA-Z0-9]", m => "9" );
此正则表达式将使用数字字符9替换所有非字母数字字符。
答案 1 :(得分:15)
获取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.
如果你想确保第一个字符是alpha,你可以在需要时用固定字符串替换if(newPwd [0]> ='0'&& newPwd [0]< =' 9' )...
我希望有人能发现这有用。 : - )
答案 2 :(得分:13)
我意识到可能有办法做到这一点。 GUID方法很棒,除了它不混合UPPER和小写字母。在我的情况下,它只生成小写。
所以我决定使用正则表达式删除非alphas然后将结果子串到我需要的长度。
string newPassword = Membership.GeneratePassword(50, 0);
newPassword = Regex.Replace(newPassword, @"[^a-zA-Z0-9]", m => "");
newPassword = newPassword.Substring(0, 10);
答案 3 :(得分:1)
您还可以尝试生成密码并连接非字母数字字符,直到达到所需的密码长度。
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();
}
答案 4 :(得分:0)
我也更喜欢GUID方法 - 这是简短的版本:
string password = Guid.NewGuid().ToString("N").Substring(0, 8);
答案 5 :(得分:0)
与breigo的解决方案有类似的方法。 也许这不是那么有效但是如此清晰和短暂
string GeneratePassword(int length)
{
var password = "";
while (password.Length < length)
{
password += string.Concat(Membership.GeneratePassword(1, 0).Where(char.IsLetterOrDigit));
}
return password;
}
答案 6 :(得分:0)
从@ SollyM的回答开始,在它周围放置一个while循环,以防止所有字符的非常不可能的事件,或者太多的字符是特殊字符,然后子串抛出异常。
name | age
-------+----
Ashis | 60
Arun | 22
Nirmal | 48
Ram | 67
Amar | 35