1
1

ComplexPassword.cs 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. using System.ComponentModel.DataAnnotations;
  2. using System.Text.RegularExpressions;
  3. namespace Masuit.Tools.Core.Validator;
  4. /// <summary>
  5. /// 强密码验证,默认最小长度6,最大长度30,必须包含数字、字母、特殊符号
  6. /// </summary>
  7. public class ComplexPasswordAttribute : ValidationAttribute
  8. {
  9. /// <summary>
  10. /// 必须包含数字
  11. /// </summary>
  12. public bool MustNumber { get; set; } = true;
  13. /// <summary>
  14. /// 必须包含小写或大写字母
  15. /// </summary>
  16. public bool MustLetter { get; set; } = true;
  17. /// <summary>
  18. /// 必须包含特殊符号
  19. /// </summary>
  20. public bool MustSymbol { get; set; } = true;
  21. private readonly int _minLength = 6;
  22. private readonly int _maxLength = 30;
  23. public ComplexPasswordAttribute()
  24. {
  25. }
  26. public ComplexPasswordAttribute(int minLength, int maxLength)
  27. {
  28. _minLength = minLength;
  29. _maxLength = maxLength;
  30. }
  31. /// <summary>
  32. /// 校验密码强度
  33. /// </summary>
  34. /// <param name="value"></param>
  35. /// <returns></returns>
  36. public override bool IsValid(object value)
  37. {
  38. string pwd = value.ToString();
  39. if (pwd.Length < _minLength)
  40. {
  41. ErrorMessage = $"密码过短,至少需要{_minLength}个字符!";
  42. return false;
  43. }
  44. string regStr = "";
  45. if (MustNumber)
  46. {
  47. regStr += "(?=.*[0-9])"; //必须包含数字
  48. }
  49. if (MustLetter)
  50. {
  51. regStr += "(?=.*[a-zA-Z])";//必须包含小写或大写字母
  52. }
  53. if (MustSymbol)
  54. {
  55. regStr += @"(?=([\x21-\x7e]+)[^a-zA-Z0-9])";//必须包含特殊符号
  56. }
  57. var regex = new Regex($"{regStr}.{{{_minLength},{_maxLength}}}", RegexOptions.IgnorePatternWhitespace);
  58. if (regex.Match(pwd).Success)
  59. {
  60. return true;
  61. }
  62. string error = "密码强度值不够,密码";
  63. if (MustNumber && !Regex.IsMatch(pwd, "(?=.*[0-9])"))
  64. {
  65. error += "必须包含数字,";
  66. }
  67. if (MustLetter && !Regex.IsMatch(pwd, "(?=.*[a-zA-Z])"))
  68. {
  69. error += "必须包含小写或大写字母,";
  70. }
  71. if (MustSymbol && !Regex.IsMatch(pwd, @"(?=([\x21-\x7e]+)[^a-zA-Z0-9])"))
  72. {
  73. error += "必须包含至少一个特殊符号,";
  74. }
  75. ErrorMessage = error + $"至少{_minLength}个字符,最多{_maxLength}个字符!";
  76. return false;
  77. }
  78. }