网站首页 网站源码
website
站点相关全部源代码,隐藏了一些关于服务器的信息
using System.ComponentModel.DataAnnotations;

namespace Dpz.Core.Auth.Models;

public class ChangePasswordModel : IValidatableObject
{
    /// <summary>
    /// 当前密码
    /// </summary>
    [Required(ErrorMessage = "请输入当前密码")]
    [Display(Name = "当前密码")]
    public string? Password { get; set; }

    /// <summary>
    /// 新密码
    /// </summary>
    [Required(ErrorMessage = "请输入新密码")]
    [StringLength(100, MinimumLength = 8, ErrorMessage = "新密码长度必须在8-100个字符之间")]
    [RegularExpression(
        @"^[\x21-\x7E]{8,}$",
        ErrorMessage = "新密码只能包含ASCII可打印字符,不能包含空格"
    )]
    [Display(Name = "新密码")]
    public string? NewPassword { get; set; }

    /// <summary>
    /// 新密码确认
    /// </summary>
    [Required(ErrorMessage = "请确认新密码")]
    [Display(Name = "确认新密码")]
    public string? NewRepeatPassword { get; set; }

    /// <summary>
    /// 双因素验证码(如已启用)
    /// </summary>
    [StringLength(6, MinimumLength = 6, ErrorMessage = "验证码必须为6位数字")]
    [RegularExpression(@"^\d{6}$", ErrorMessage = "验证码必须为6位数字")]
    [Display(Name = "双因素验证码")]
    public string? PinCode { get; set; }

    /// <summary>
    /// 自定义验证逻辑
    /// </summary>
    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        // 验证新密码确认
        if (!string.IsNullOrEmpty(NewPassword) && !string.IsNullOrEmpty(NewRepeatPassword))
        {
            if (NewPassword != NewRepeatPassword)
            {
                yield return new ValidationResult(
                    "新密码与确认密码不匹配",
                    new[] { nameof(NewRepeatPassword) }
                );
            }
        }

        // 验证新密码不能与当前密码相同
        if (!string.IsNullOrEmpty(Password) && !string.IsNullOrEmpty(NewPassword))
        {
            if (Password == NewPassword)
            {
                yield return new ValidationResult(
                    "新密码不能与当前密码相同",
                    new[] { nameof(NewPassword) }
                );
            }
        }
    }
}
⚠⚠    以下内容为AI分析的结果,请根据实际情况进行判断。

上述代码定义了一个名为 ChangePasswordModel 的 C# 类,主要用于处理用户更改密码的请求。这个类实现了 IValidatableObject 接口,允许自定义验证逻辑。以下是代码的详细解释:

属性

  1. Password:

    • 类型:string?(可空字符串)
    • 描述:表示用户当前的密码。
    • 特性:
      • [Required]:此属性是必填的,用户必须输入当前密码。
      • [Display]:用于在用户界面上显示的名称。
  2. NewPassword:

    • 类型:string?
    • 描述:表示用户希望设置的新密码。
    • 特性:
      • [Required]:此属性是必填的,用户必须输入新密码。
      • [StringLength]:限制新密码的长度在8到100个字符之间。
      • [RegularExpression]:新密码只能包含ASCII可打印字符,并且不能包含空格。
      • [Display]:用于在用户界面上显示的名称。
  3. NewRepeatPassword:

    • 类型:string?
    • 描述:用于确认用户输入的新密码。
    • 特性:
      • [Required]:此属性是必填的,用户必须确认新密码。
      • [Display]:用于在用户界面上显示的名称。
  4. PinCode:

    • 类型:string?
    • 描述:用于双因素身份验证的验证码(如果启用)。
    • 特性:
      • [StringLength]:限制验证码的长度为6位。
      • [RegularExpression]:验证码必须是6位数字。
      • [Display]:用于在用户界面上显示的名称。

自定义验证逻辑

Validate 方法实现了 IValidatableObject 接口,提供了自定义的验证逻辑:

  1. 新密码确认:

    • 检查 NewPasswordNewRepeatPassword 是否相同。如果不相同,返回一个验证错误,提示“新密码与确认密码不匹配”。
  2. 新密码与当前密码相同:

    • 检查 PasswordNewPassword 是否相同。如果相同,返回一个验证错误,提示“新密码不能与当前密码相同”。

总结

这个类的主要功能是封装用户更改密码所需的信息,并提供必要的验证逻辑,以确保用户输入的密码符合安全要求和一致性。通过使用数据注解和自定义验证,确保了输入的有效性和安全性。

loading