RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 919958
Accepted
Андрей
Андрей
Asked:2020-12-14 19:59:04 +0000 UTC2020-12-14 19:59:04 +0000 UTC 2020-12-14 19:59:04 +0000 UTC

使用 DataAnnotations 库

  • 772

请告诉我注解 [DataType(DataType.Password)] 是什么意思?例如,如果我在视图中使用 @Html.Password 助手或者只是在助手处写入 textbox new { @type = "password" },那么当我在此字段中输入字符时,字符将显示为密码的星号安全。但是我试图在模型中的属性上放置一个带有密码类型的注释。没有这样的事情发生。那么这个注解有什么用呢?

c#
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. Best Answer
    Yaroslav
    2020-12-14T20:35:47Z2020-12-14T20:35:47Z

    DataAnnotations用于验证模型的字段,即如果是Password,则可以通过注解指定,假设密码应该以大写字母开头,密码中的最小/最大字符数,可以指定密码应包含特殊字符。符号等。

    模型验证

    例子:

    [Required]
    [StringLength(18, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
    [RegularExpression(@"((?=.*[a-z]+)(?=.*[A-Z]+)(?=.*[0-9]+)(?=.*[!@#$%^&*()_+=\[{\]};:<>|./?,-]))")]
    [DataType(DataType.Password)]
    [Display(Name = "Password")]
    public string Password { get; set; }
    

    密码数据注释

    用于验证确认密码的数据注释

    在使用 ASP.NET Identity 认证授权系统时,我们可能会遇到以下问题:输入密码时,会触发内置的验证逻辑,而我们无法使用标准的验证属性机制对这个逻辑进行任何更改。但是如果我们需要设置不同的最小密码长度等怎么办?尽管内置的验证逻辑对我们来说是隐藏的,但我们可以覆盖它。验证机制由 UserManager 类的 PasswordValidator 属性处理。它存储了一个我们可以修改的验证对象。

    如果我们导航到文件IdentityConfig.cs夹中的文件App_Start,那么在类定义中ApplicationUserManager我们可以看到密码验证器的使用:

    var manager = new ApplicationUserManager
                    (new UserStore<ApplicationUser>
                        (context.Get<ApplicationDbContext>()));
    
    //..........................
    
    manager.PasswordValidator = new PasswordValidator
    {
        RequiredLength = 6,
        RequireNonLetterOrDigit = true,
        RequireDigit = true,
        RequireLowercase = true,
        RequireUppercase = true,
    };
    

    在这里,内置类用于定义密码验证PasswordValidator,它具有以下属性:

    • RequiredLength:最小密码长度;
    • RequireNonLetterOrDigit:如果为真,则密码必须至少包含一个非字母数字字符;
    • RequireDigit:如果为真,则密码必须至少有一位;
    • RequireLowercase:如果为真,则密码必须至少包含一个小写字符;
    • RequireUppercase: 如果为真,则密码必须至少包含一个大写字符。

    对于大多数情况,这个功能就足够了,我们可以设置最小密码长度,输入字母、数字或非字母数字字符。但是,如果我们需要更复杂的验证逻辑,我们将不得不定义自己的验证器类。

    验证器对象代表一个接口对象IIdentityValidator。在这种情况下,该类的实例被用作这样的对象PasswordValidator,它设置最小密码长度和许多其他规则。但是,我们无法对这个验证器做任何其他事情。因此,要创建更复杂的验证逻辑,我们需要创建一个单独的类。

    因此,让我们创建以下类:

    public class CustomPasswordValidator : IIdentityValidator<String>
    {
        public Int32 MinRequiredLength { get; private set; } // минимальная длина
    
        public CustomPasswordValidator(Int32 MinRequiredLength) =>
            this.MinRequiredLength = MinRequiredLength;
    
        public Task<IdentityResult> ValidateAsync(String item)
        {
            var hasLowerChar = new Regex(@"[a-z]+");
            var hasUpperChar = new Regex(@"[A-Z]+");
            var hasMiniMaxChars = new Regex($@".{MinRequiredLength, 15}");
            var hasNumber = new Regex(@"[0-9]+");
            var hasSymbols = new Regex(@"[!@#$%^&*()_+=\[{\]};:<>|./?,-]");
    
            if (String.IsNullOrWhiteSpace(item)) throw new Exception("Пароль не должен быть пустым");
    
            if (!Regex.IsMatch(item, hasLowerChar.ToString()))
            {
                return Task.FromResult(
                    IdentityResult.Failed("Пароль должен содержать хотя бы одну строчную букву"));
            }
            else if (!Regex.IsMatch(item, hasUpperChar.ToString()))
            {
                return Task.FromResult(
                    IdentityResult.Failed("Пароль должен содержать хотя бы одну заглавную букву"));
            }
            else if (!Regex.IsMatch(item, hasMiniMaxChars.ToString()))
            {
                return Task.FromResult(
                    IdentityResult.Failed($"Пароль должен быть не менее {MinRequiredLength} символов"));
            }
            else if (!Regex.IsMatch(item, hasNumber.ToString()))
            {
                return Task.FromResult(
                    IdentityResult.Failed("Пароль должен содержать хотя бы одно числовое значение"));
            }
            else if (!Regex.IsMatch(item, hasSymbols.ToString()))
            {
                return Task.FromResult(
                    IdentityResult.Failed("Пароль должен содержать хотя бы один специальный символ"));
            }
            return Task.FromResult(IdentityResult.Success);
        }
    }
    

    验证器类实现 IIdentityValidator 接口,该接口具有一个 ValidateAsync 方法。该方法接受一个字符串参数,取而代之的是正在验证的密码字符串将被传递到程序中。它可以执行以下检查:

    • 检查密码是否为空;
    • 检查小写字母的内容;
    • 检查大写字母的内容;
    • 检查最小/最大。人物;
    • 检查数字的内容;
    • 检查特殊内容 人物。

    然后在 ApplicationUserManager 类定义中我们也可以使用它:

    var manager = new ApplicationUserManager
                    (new UserStore<ApplicationUser>
                        (context.Get<ApplicationDbContext>()));
    //..............................
    manager.PasswordValidator = new CustomPasswordValidator(5);
    
    • 4
  2. Андрей
    2020-12-17T00:29:17Z2020-12-17T00:29:17Z

    为了将标有 [DataType(DataType.Password)] 注释的字段作为密码,并且在向该字段输入值时,值用星号标记,因为它应该在密码中,您需要使用EditorFor 助手,在链接的主题中有更详细的答案: https://stackoverflow.com/questions/6044922/model-does-not-apply-datatype-password

    • 3

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    是否可以在 C++ 中继承类 <---> 结构?

    • 2 个回答
  • Marko Smith

    这种神经网络架构适合文本分类吗?

    • 1 个回答
  • Marko Smith

    为什么分配的工作方式不同?

    • 3 个回答
  • Marko Smith

    控制台中的光标坐标

    • 1 个回答
  • Marko Smith

    如何在 C++ 中删除类的实例?

    • 4 个回答
  • Marko Smith

    点是否属于线段的问题

    • 2 个回答
  • Marko Smith

    json结构错误

    • 1 个回答
  • Marko Smith

    ServiceWorker 中的“获取”事件

    • 1 个回答
  • Marko Smith

    c ++控制台应用程序exe文件[重复]

    • 1 个回答
  • Marko Smith

    按多列从sql表中选择

    • 1 个回答
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Suvitruf - Andrei Apanasik 什么是空? 2020-08-21 01:48:09 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5