ComplexPassword.cs 2.7 KB

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