Как настроить Asp.net Identity 2 для имени пользователя уже принятого сообщения проверки?
Как я могу настроить имя пользователя Asp.net Identity 2 уже принятое сообщение проверки (Имя XYZ уже занято.)? Спасибо
5 ответов
Ну, я не нашел простого решения этой проблемы. И под простым я подразумеваю изменение некоторого сообщения в атрибуте / модели / контроллере.
Одним из возможных решений может быть:
После выполнения
var result = await UserManager.CreateAsync(user, model.Password);
В случае, если этот результат не является успешным, вы можете проверить его свойство Errors для "Имя 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
};
}
Это сделать гораздо проще, чем принятый ответ.
Добавить класс и унаследовать его от 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;
}
}
Теперь используйте новый класс в своем Startup.cs и все.
services.AddDefaultIdentity<AppUser>(options => ... )
.AddErrorDescriber<AppErrorDescriber>();
Просто настройте свой AddErrors
метод как это:
private void AddErrors(IdentityResult result)
{
foreach (var error in result.Errors)
{
if (error.StartsWith("Name"))
{
var NameToEmail= Regex.Replace(error,"Name","Email");
ModelState.AddModelError("", NameToEmail);
}
else
{
ModelState.AddModelError("", error);
}
}
}
Используйте XLocalizer — пакет Nuget для локализации. Смотрите документы здесь .
Простой способ добавить свою собственность в ApplicationUser
класс как:
public class AppUser:IdentityUser
{
public string MyUserName{get; set;}
}