asp.net-mvc - 配置默认 MVC 应用程序以使用复杂密码

标签 asp.net-mvc

我正在尝试修改默认的 MVC 应用程序,以要求用户名是电子邮件地址,并且还需要复杂的密码。我发现这篇优秀的文章可以处理要求用户名是电子邮件地址的问题。 http://blachniet.com/2013/11/10/email-addresses-as-user-names-in-asp-net-identity/

我已设法要求最小密码长度为 4(见下文)。但现在我正在寻求创建一个更复杂的验证器。 PasswordValidator 类似乎是从 IIdentityValidator 派生的。关于如何创建这种类型的 CustomPasswordValidator 有什么想法吗?假设我们将使用正则表达式模式来匹配复杂性。

public AccountController(UserManager<ApplicationUser> userManager)
{
    UserManager = userManager;

    //from http://blachniet.com/2013/11/10/email-addresses-as-user-names-in-asp-net-identity/
    UserManager.UserValidator = new CustomUserValidator<ApplicationUser>(UserManager);

    UserManager.PasswordValidator = new MinimumLengthValidator(4);
}

最佳答案

这是我的解决方案。您应该能够从 VS2013 中的默认 MVC 5 Web 应用程序重新创建它。你会得到一些语法错误。添加适当的Using语句并相应地调整命名空间。

修改<appSettings> Web.config 部分并添加以下键

    <add key="UsernameRegex" value="^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$" />
    <!-- Require username to be an email address -->
    <add key="Simple" value="^[^\s]{{{0},}}$" />
    <!-- Simple, non-blank password -->
    <add key="1Upper1Lower1Number" value="^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{{{0},}}$" />
    <!-- Complex -->
    <add key="1Upper1Lower1Number1Symbol" value="^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[^\da-zA-Z]).{{{0},}}$" />
    <!-- More Complex -->
    <add key="PasswordMinLength" value="8" />
    <!-- Min Password length -->
    <add key="PasswordExpression" value="Simple" />    

添加新的类文件

using Microsoft.AspNet.Identity;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Web;

namespace MyApp.Classes
{
    public class CustomUserValidator<TUser> : IIdentityValidator<TUser>
        where TUser : Microsoft.AspNet.Identity.IUser
    {
        private readonly Regex EmailRegex;
        private readonly UserManager<TUser> _manager;

        public CustomUserValidator()
        {
        }

        public CustomUserValidator(UserManager<TUser> manager, string complexityExpression)
        {
            _manager = manager;
            EmailRegex = new Regex(complexityExpression, RegexOptions.Compiled | RegexOptions.IgnoreCase);
        }

        public async Task<IdentityResult> ValidateAsync(TUser item)
        {
            var errors = new List<string>();
            if (!EmailRegex.IsMatch(item.UserName))
                errors.Add("Enter a valid email address.");

            if (_manager != null)
            {
                var otherAccount = await _manager.FindByNameAsync(item.UserName);
                if (otherAccount != null && otherAccount.Id != item.Id)
                    errors.Add("Select a different email address. An account has already been created with this email address.");
            }

            return errors.Any()
                ? IdentityResult.Failed(errors.ToArray())
                : IdentityResult.Success;
        }
    }

    public class CustomPasswordValidator<TUser> : IIdentityValidator<string>
    {
        private Regex PasswordRegex;

        public CustomPasswordValidator(string complexityExpression)
        {
            PasswordRegex = new Regex(complexityExpression, RegexOptions.Compiled);
        }

        public async Task<IdentityResult> ValidateAsync(string item)
        {
            return await Task.Factory.StartNew<IdentityResult>(() =>
            {
                var errors = new List<string>();
                if (!PasswordRegex.IsMatch(item))
                    errors.Add("Password is not complex");

                return errors.Any()
                    ? IdentityResult.Failed(errors.ToArray())
                    : IdentityResult.Success;
            });
        }

    }
}

AccountController.cs替换public AccountController(UserManager<ApplicationUser> userManager)方法与

public AccountController(UserManager<ApplicationUser> userManager)
{
    UserManager = userManager;
    string exp = string.Format(ConfigurationManager.AppSettings[ConfigurationManager.AppSettings["PasswordExpression"]], ConfigurationManager.AppSettings["PasswordMinLength"]);
    UserManager.PasswordValidator = new CustomPasswordValidator<ApplicationUser>(exp);
    UserManager.UserValidator = new CustomUserValidator<ApplicationUser>(UserManager, ConfigurationManager.AppSettings["UsernameRegex"]);
}

归功于这个人:http://blachniet.com/2013/11/10/email-addresses-as-user-names-in-asp-net-identity/

关于asp.net-mvc - 配置默认 MVC 应用程序以使用复杂密码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20150263/

相关文章:

asp.net-mvc - MVC4部分名称带点

asp.net-mvc - 如何配置 .NET 测试程序集以使用网站 web.config?

c# - 如何检索 MVC 页面上所有输入的所有值

c# - MVC 5 Razor View 未将 bool 绑定(bind)到输入

asp.net-mvc - 如何从我自己的 HtmlHelper 中访问 HtmlHelper 方法?

c# - 如何确定使用哪种身份验证方法?

asp.net-mvc - 从 MVC 中的 _Layout.cshtml 中的 Ninject 获取对象实例

c# - 类型 'System.Web.Mvc.MvcWebRazorHostFactory' 的表达式不能用于返回类型 'System.Web.WebPages.Razor.WebRazorHostFactory'

javascript - 在 jQuery 中访问 Html 编码的字段值

javascript - jQuery.cookie 不存储我的 JSON 字符串