包含一个数字以自动生成密码

时间:2016-01-25 05:16:08

标签: c# asp.net-mvc security asp.net-membership

我正在使用以下代码段自动生成密码

string Password = Membership.GeneratePassword(12, 1);

但是这里有时它的生成密码没有数字值然后我得到跟随错误

  

密码必须至少有一位数字('0' - '9')。

如何升级上述代码以使用数字值生成

3 个答案:

答案 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"

当您生成临时密码时,如果您提示您的用户在登录时更改其密码,将会很有帮助。