Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 正在验证成员身份。GeneratePassword_C#_.net_Regex_Linq_Passwords - Fatal编程技术网

C# 正在验证成员身份。GeneratePassword

C# 正在验证成员身份。GeneratePassword,c#,.net,regex,linq,passwords,C#,.net,Regex,Linq,Passwords,我正在使用Membership.GeneratePassword()生成随机密码。有时返回的值与所需的验证要求不匹配。用户还可以提供密码,从而满足验证要求 我基本上想检查返回的密码,如果它不包含大写字母、小写字母和数字,然后生成另一个 有时我的支票会返回真值,但显然不是 我尝试过正则表达式和一些LINQ,因此: string generatePassword() { password = System.Web.Security.Membership.GeneratePassword(1

我正在使用Membership.GeneratePassword()生成随机密码。有时返回的值与所需的验证要求不匹配。用户还可以提供密码,从而满足验证要求

我基本上想检查返回的密码,如果它不包含大写字母、小写字母和数字,然后生成另一个

有时我的支票会返回真值,但显然不是

我尝试过正则表达式和一些LINQ,因此:

string generatePassword()
{
    password =  System.Web.Security.Membership.GeneratePassword(16, 8);

    if (password.Any(c => char.IsUpper(c)) && password.Any(c => char.IsDigit(c)) && password.Any(c => char.IsLower(c)))
    {
        return password;
    }
    else
    {
       generatePassword();
    }
}


void test() {
    var pattern = @"^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[!@#$%^&*()_\-+=[{\]};:<>|.\/\?])(?=.{8,})";

    var count = 0;
    for (var i = 0; i < 10000; i++)
    {
        var password = generatePassword();
        if (!Regex.Match(password, pattern).Success)
        {
             Console.WriteLine(password);
             count++;
        }
    }

    Console.WriteLine("There were {0} non matches", count);
}
string generatePassword()
{
密码=System.Web.Security.Membership.GeneratePassword(16,8);
if(password.Any(c=>char.IsUpper(c))&&password.Any(c=>char.IsDigit(c))&&password.Any(c=>char.IsLower(c)))
{
返回密码;
}
其他的
{
generatePassword();
}
}
无效测试(){
变量模式=@“^(?=.[a-z])(?=.[a-z])(?=.[0-9])(?=.[!@$%^&*()::。\-+=[{\]}])(?=.{8,});
var计数=0;
对于(变量i=0;i<10000;i++)
{
var password=generatePassword();
if(!Regex.Match(密码、模式).Success)
{
控制台写入线(密码);
计数++;
}
}
WriteLine(“有{0}个不匹配项”,count);
}
在我看来,上面的代码应该总是返回一个有效的密码。我有一个奇怪的场景,它将返回一个没有数字的密码,因此检查失败,但是如果我对返回的密码执行相同的
passowrd.Any(char.IsDigit)
test,它会说true

如果有帮助,密码至少需要8位数字,包括大写、小写、数字和特殊字符:
!@$%^&*()_-+=[{]};:|./?


谢谢。

也许您的正则表达式是有效的,但我认为很难理解它的作用

考虑使用以下代码,其优点是在检测到密码有效之前,它只会枚举密码。除此之外,它很容易理解,很容易进行小的更改,比如大小应该至少是12个字符,或者它不必再有大写字符,或者它应该包含两个数字

我将把它编程为字符串的扩展方法。如果您决定您的密码不再是字符串,那么更改将是最小的。看

为了确保它结束,您可以添加一个计数器,并在尝试1000次后停止;或者只添加一个随机的大写/小写/特殊字符

检查以下答案:
static bool IsSpecialChar(this char c)
{
    const string specialChars = "!@#$%^&*()_-+=[{]};:<>|./?";
    return specialChars.Contains(c);
}

static bool IsValidPassword(this string password)
{
    // the password needs to be at least 8 characters,
    // contain an uppercase, lowercase, digit and a special char

    // TODO: exception if password == null;
    if (password.Length < 8) return false;

    bool uppercaseDetected = false;
    bool lowercaseDetected = false;
    bool digitDetected = false;
    bool specialCharDetected = false;

    using (IEnumerator<char> enumerator = password.GetEnumerator())
    {
        while (enumerator.MoveNext
           && !(uppercaseDetected && lowercaseDetected 
                 && digitDetected && specialCharDetected))
        {
            // a character is available, and we still don't know if it is a proper password
            char c = enumerator.Current;
            uppercaseDetected = uppercaseDetected || Char.IsUpperCase(c);
            lowercaseDetected = lowercaseDetected || Char.IsLowerCase(c);
            digitDetected = digitDetected || Char.IsDigit(c);
            specialCharDetected = specialCharDetected || c.IsSpecialChar();
        }

        return uppercaseDetected && lowercaseDetected 
            && digitDetected && specialCharDetected;
    }
}
string GeneratePassword()
{
    string proposedPassword = ...;
    while (!proposedPassword.IsValidPassword())
    {
        proposedPassword = ...;
    }
}