如何自定义Asp.net Identity 2用户名已经采取的验证消息?

 xiaol 发布于 2022-12-04 00:22

我如何自定义已经采用的Asp.net Identity 2用户名验证消息(名称XYZ已被采用.)?谢谢

1 个回答
  • 好吧,我没有找到任何解决这个问题的简单方法.简单来说,我的意思是在属性/模型/控制器中修改一些消息.

    一种可能的解决方案是:

    执行后

    var result = await UserManager.CreateAsync(user, model.Password);
    

    如果结果不成功,您可以检查"名称XYZ已被采用"的错误属性.模式并将其替换为您的自定义消息.

    另一个解决方案(这是我的首选方式)是编写一个自定义UserValidation类:

     /// <summary>
        ///     Validates users before they are saved to an IUserStore
        /// </summary>
        /// <typeparam name="TUser"></typeparam>
        public class CustomUserValidator<TUser> : UserValidator<TUser, string>
            where TUser : ApplicationUser
        {
            /// <summary>
            ///     Constructor
            /// </summary>
            /// <param name="manager"></param>
            public CustomUserValidator(UserManager<TUser, string> manager) : base(manager)
            {
                this.Manager = manager;
            }
    
            private UserManager<TUser, string> Manager { get; set; }
    
            /// <summary>
            ///     Validates a user before saving
            /// </summary>
            /// <param name="item"></param>
            /// <returns></returns>
            public override async Task<IdentityResult> ValidateAsync(TUser item)
            {
                if (item == null)
                {
                    throw new ArgumentNullException("item");
                }
                var errors = new List<string>();
                await ValidateUserName(item, errors);
                if (RequireUniqueEmail)
                {
                    await ValidateEmail(item, errors);
                }
                if (errors.Count > 0)
                {
                    return IdentityResult.Failed(errors.ToArray());
                }
                return IdentityResult.Success;
            }
    
            private async Task ValidateUserName(TUser user, List<string> errors)
            {
                if (string.IsNullOrWhiteSpace(user.UserName))
                {
                    errors.Add(String.Format(CultureInfo.CurrentCulture, Resources.PropertyTooShort, "Name"));
                }
                else if (AllowOnlyAlphanumericUserNames && !Regex.IsMatch(user.UserName, @"^[A-Za-z0-9@_\.]+$"))
                {
                    // If any characters are not letters or digits, its an illegal user name
                    errors.Add(String.Format(CultureInfo.CurrentCulture, Resources.InvalidUserName, user.UserName));
                }
                else
                {
                    var owner = await Manager.FindByNameAsync(user.UserName);
                    if (owner != null && !EqualityComparer<string>.Default.Equals(owner.Id, user.Id))
                    {
                        errors.Add(String.Format(CultureInfo.CurrentCulture, Resources.DuplicateName, user.UserName));
                    }
                }
            }
    
            // make sure email is not empty, valid, and unique
            private async Task ValidateEmail(TUser user, List<string> errors)
            {
                if (!user.Email.IsNullOrWhiteSpace())
                {
                    if (string.IsNullOrWhiteSpace(user.Email))
                    {
                        errors.Add(String.Format(CultureInfo.CurrentCulture, Resources.PropertyTooShort, "Email"));
                    return;
                    }
                    try
                    {
                        var m = new MailAddress(user.Email);
                    }
                    catch (FormatException)
                    {
                        errors.Add(String.Format(CultureInfo.CurrentCulture, Resources.InvalidEmail, email));
                    return;
                    }
                }
                var owner = await Manager.FindByEmailAsync(user.Email);
                if (owner != null && !EqualityComparer<string>.Default.Equals(owner.Id, user.Id))
                {
                    errors.Add(String.Format(CultureInfo.CurrentCulture, Resources.DuplicateEmail, email));
                }
            }
        }
    

    您可以看到所有验证错误消息正在使用的资源,因此通过在资源中指定自定义格式,您将能够自定义这些消息.

    您可以在ApplicationUserManager课堂上注册验证员,Create方法:

    public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context) 
    {
       manager.UserValidator = new CustomUserValidator<ApplicationUser>(manager)
       {
           AllowOnlyAlphanumericUserNames = false,
           RequireUniqueEmail = true
       };
    }
    

    2022-12-11 02:08 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有