ASP.NET Identity : Generate random password

前端 未结 6 1157
天涯浪人
天涯浪人 2021-02-02 10:50

Is there any built in function that creates random passwords ? Asp.net simple memebership used to have a similar method

6条回答
  •  耶瑟儿~
    2021-02-02 11:49

    Membership.GeneratePassword() create a password that isn't compliant with Identity validator.

    I have written a simple function that consider UserManager Validator for creating a right random password to assign to user.

    It simply generates random chars and check if chars satisfy Validator requirements. If the requirements aren't satisfied, it appends the remaining chars to satisfy rules.

    private string GeneratePassword(MessagePasswordValidator validator)
    {
        if (validator == null)
            return null;
    
        bool requireNonLetterOrDigit = validator.RequireNonLetterOrDigit;
        bool requireDigit = validator.RequireDigit;
        bool requireLowercase = validator.RequireLowercase;
        bool requireUppercase = validator.RequireUppercase;
    
        string randomPassword = string.Empty;
    
        int passwordLength = validator.RequiredLength;
    
        Random random = new Random();
        while (randomPassword.Length != passwordLength)
        {
            int randomNumber = random.Next(48, 122);  // >= 48 && < 122 
            if (randomNumber == 95 || randomNumber == 96) continue;  // != 95, 96 _'
    
            char c = Convert.ToChar(randomNumber);
    
            if (requireDigit)
                if (char.IsDigit(c))
                    requireDigit = false;
    
            if (requireLowercase)
                if (char.IsLower(c))
                    requireLowercase = false;
    
            if (requireUppercase)
                if (char.IsUpper(c))
                    requireUppercase = false;
    
            if (requireNonLetterOrDigit)
                if (!char.IsLetterOrDigit(c))
                    requireNonLetterOrDigit = false;
    
            randomPassword += c;
        }
    
        if (requireDigit)
            randomPassword += Convert.ToChar(random.Next(48, 58));  // 0-9
    
        if (requireLowercase)
            randomPassword += Convert.ToChar(random.Next(97, 123));  // a-z
    
        if (requireUppercase)
            randomPassword += Convert.ToChar(random.Next(65, 91));  // A-Z
    
        if (requireNonLetterOrDigit)
            randomPassword += Convert.ToChar(random.Next(33, 48));  // symbols !"#$%&'()*+,-./
    
        return randomPassword;
    }
    

    and calling:

    string password = GeneratePassword(UserManager.PasswordValidator as MessagePasswordValidator);
    

提交回复
热议问题