using System.ComponentModel.DataAnnotations; using System.Text.RegularExpressions; namespace Masuit.Tools.Core.Validator; /// /// 强密码验证,默认最小长度6,最大长度30,必须包含数字、字母、特殊符号 /// public class ComplexPasswordAttribute : ValidationAttribute { /// /// 必须包含数字 /// public bool MustNumber { get; set; } = true; /// /// 必须包含小写或大写字母 /// public bool MustLetter { get; set; } = true; /// /// 必须包含特殊符号 /// public bool MustSymbol { get; set; } = true; private readonly int _minLength = 6; private readonly int _maxLength = 30; public ComplexPasswordAttribute() { } public ComplexPasswordAttribute(int minLength, int maxLength) { _minLength = minLength; _maxLength = maxLength; } /// /// 校验密码强度 /// /// /// public override bool IsValid(object value) { string pwd = value.ToString(); if (pwd.Length < _minLength) { ErrorMessage = $"密码过短,至少需要{_minLength}个字符!"; return false; } string regStr = ""; if (MustNumber) { regStr += "(?=.*[0-9])"; //必须包含数字 } if (MustLetter) { regStr += "(?=.*[a-zA-Z])";//必须包含小写或大写字母 } if (MustSymbol) { regStr += @"(?=([\x21-\x7e]+)[^a-zA-Z0-9])";//必须包含特殊符号 } var regex = new Regex($"{regStr}.{{{_minLength},{_maxLength}}}", RegexOptions.IgnorePatternWhitespace); if (regex.Match(pwd).Success) { return true; } string error = "密码强度值不够,密码"; if (MustNumber && !Regex.IsMatch(pwd, "(?=.*[0-9])")) { error += "必须包含数字,"; } if (MustLetter && !Regex.IsMatch(pwd, "(?=.*[a-zA-Z])")) { error += "必须包含小写或大写字母,"; } if (MustSymbol && !Regex.IsMatch(pwd, @"(?=([\x21-\x7e]+)[^a-zA-Z0-9])")) { error += "必须包含至少一个特殊符号,"; } ErrorMessage = error + $"至少{_minLength}个字符,最多{_maxLength}个字符!"; return false; } }