usuarios usuario sesiones permisos obtener nombre net mvc mostrar manejo logueado como autenticacion asp asp.net asp.net-mvc asp.net-mvc-5 asp.net-identity asp.net-identity-2

asp.net - sesiones - obtener usuario logueado c#



¿Cómo se puede personalizar el mensaje de validación del nombre de usuario de Asp.net Identity 2? (3)

Bueno, no encontré ninguna solución simple para este problema. Y por simple me refiero a modificar algún mensaje en un atributo / modelo / controlador.

Una posible solución podría ser:

Despues de ejecutar

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

En caso de que el resultado no sea exitoso, puede verificar su propiedad de Errores para el "Nombre XYZ ya está tomado". Patrón y reemplazarlo con su mensaje personalizado.

Otra solución (esta es mi forma preferida) es escribir una clase personalizada de 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)); } } }

Puede ver que para todos los mensajes de error de validación de los Recursos que se están utilizando, por lo tanto, al especificar un formato personalizado en sus recursos, podrá personalizar esos mensajes.

Puede registrar su validador en la clase ApplicationUserManager , Create método:

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

¿Cómo puedo personalizar el mensaje de validación del nombre de usuario de Asp.net Identity 2 (ya se tomó el nombre XYZ)? Gracias


La manera fácil de agregar su propia propiedad a la clase ApplicationUser como:

public class AppUser:IdentityUser { public string MyUserName{get; set;} }


Solo personaliza tu método AddErrors esta manera:

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