Asp.net

如何自定義 Asp.net Identity 2 使用者名已採取驗證消息?

  • December 26, 2014

如何自定義 Asp.net Identity 2 使用者名已採用驗證消息(名稱 XYZ 已採用。)?謝謝

好吧,我沒有找到任何簡單的解決方案來解決這個問題。簡單地說,我的意思是修改屬性/模型/控制器中的一些消息。

一種可能的解決方案可能是:

執行後

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
  };
}

引用自:https://stackoverflow.com/questions/27655578