我正在使用以下代码段自动生成密码
string Password = Membership.GeneratePassword(12, 1);
但是这里有时它的生成密码没有数字值然后我得到跟随错误
密码必须至少有一位数字('0' - '9')。
如何升级上述代码以使用数字值生成
答案 0 :(得分:4)
您可以进一步处理生成的密码,如果它不包含数字,您可以随机将其中一个更改为如下数字:
if (!Password.Any(x => char.IsDigit(x))){
Random rand = new Random();
char[] pass = Password.ToCharArray();
pass[rand.Next(Password.Length)] = Convert.ToChar(rand.Next(10) + '0');
Password = new string(pass);
}
如果您想避免没有较低的字符,可以添加另一个检查,例如:
if (!Password.Any(x => char.IsLower(x))) {
//Do similarly but using rand.Next(26) + 'a' instead of rand.Next(10) + '0'
}
如果您想避免将已更改为数字的位置作为您更改为较低字符的位置,只需将rand.Next(Password.Length)
存储在第一个数字代中,并避免为第二个数字生成相同的值。
或者,更强大的是,我们可以定义List
nonSelectedIndexes
并在每次执行替换操作时从中挑选一个随机数:
List<int> nonSelectedIndexes = new List<int>(Enumerable.Range(0, Password.Length));
Random rand = new Random();
if (!Password.Any(x => char.IsDigit(x))) { //does not contain digit
char[] pass = Password.ToCharArray();
int pos = nonSelectedIndexes[rand.Next(nonSelectedIndexes.Count)];
nonSelectedIndexes.Remove(pos);
pass[pos] = Convert.ToChar(rand.Next(10) + '0');
Password = new string(pass);
}
if (!Password.Any(x => char.IsLower(x))) { //does not contain lower
char[] pass = Password.ToCharArray();
int pos = nonSelectedIndexes[rand.Next(nonSelectedIndexes.Count)];
nonSelectedIndexes.Remove(pos);
pass[pos] = Convert.ToChar(rand.Next(26) + 'a');
Password = new string(pass);
}
if (!Password.Any(x => char.IsUpper(x))) { //does not contain upper
char[] pass = Password.ToCharArray();
int pos = nonSelectedIndexes[rand.Next(nonSelectedIndexes.Count)];
nonSelectedIndexes.Remove(pos);
pass[pos] = Convert.ToChar(rand.Next(26) + 'A');
Password = new string(pass);
}
//And so on
//Do likewise to any other condition
注意:如果您将此用于与安全相关的任何内容,请consider Mr. SilverlightFox comment。
答案 1 :(得分:0)
{{1}}
答案 2 :(得分:0)
我有一个简单的方法:
string Password = Membership.GeneratePassword(12, 1);
Password = Password + "1"
当您生成临时密码时,如果您提示您的用户在登录时更改其密码,将会很有帮助。