Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can customize Asp.net Identity 2 username already taken validation message?

Tags:

How can i customize Asp.net Identity 2 username already taken validation message(Name XYZ is already taken.)? Thanks

like image 851
Nazmul Hossain Avatar asked Dec 26 '14 10:12

Nazmul Hossain


People also ask

How can we get logged in user role in asp net identity?

After getting the Identity User from SignInManager , call GetRolesAsync on UserManager and pass identity user as parameter. It will return a list of roles the identity user has enrolled in.


2 Answers

Well, I didn't find any simple solution to this issue. And by simple i mean modifying some message in a attribute/model/controller.

One possible solution could be:

After executing

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

In case that result is not successful you can check it's Errors property for the "Name XYZ is already taken." pattern and replace it with your custom message.

Another solution (this is my preferred way) is to write a custom UserValidation class:

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

You can see that for all the validation error messages Resources being used, So by specifying a custom format in your resources you will be able to customize those messages.

You can register your validator in ApplicationUserManager class, Create method:

public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context)  {    manager.UserValidator = new CustomUserValidator<ApplicationUser>(manager)    {        AllowOnlyAlphanumericUserNames = false,        RequireUniqueEmail = true    }; } 
like image 59
Alex Art. Avatar answered Sep 30 '22 13:09

Alex Art.


It can be done much easier than the accepted answer.

Add a class and inherit it from IdentityErrorDescriber

public class AppErrorDescriber : IdentityErrorDescriber     {         public override IdentityError DuplicateUserName(string userName)         {             var error = base.DuplicateUserName(userName);             error.Description = "This email address has already been registered. Please log in.";             return error;         }     } 

Now use the new class in your Startup.cs and that's it.

services.AddDefaultIdentity<AppUser>(options => ... )                 .AddErrorDescriber<AppErrorDescriber>(); 
like image 28
Ihor Deyneka Avatar answered Sep 30 '22 11:09

Ihor Deyneka