c# - net - token web api
ASP.NET MVC Identity Email/Nombre de usuario con caracteres especiales (2)
Está configurando AllowOnlyAlphanumericUserNames = false
en el método Create
de ApplicationUserManager
. Dentro de la acción PostRegister
de su ApiController
, está actualizando una instancia de ApplicationUserManager
. AllowOnlyAlphanumericUserNames
es verdadero por defecto.
Puede cambiar el Constructor de ApplicationUserManager
public ApplicationUserManager(IUserStore<ApplicationUser> store): base(store)
{
UserValidator = new UserValidator<ApplicationUser>(this)
{
AllowOnlyAlphanumericUserNames = false,
RequireUniqueEmail = true
};
}
De esta forma, AllowOnlyAlphanumericUserNames
se configura como falso cuando se AllowOnlyAlphanumericUserNames
una instancia de ApplicationUserManger
.
Nota: Es mejor obtener el ApplicationUserManager
de OwinContext
igual que en AccountController
de la plantilla MVC5 predeterminada o usar Dependency Injection.
Al registrar una cuenta a través de la API web con un correo electrónico como "[email protected]", Fiddler devuelve el siguiente error. Tenga en cuenta que el correo electrónico también se utiliza como nombre de usuario, por lo que ambos campos son iguales . Pero funciona al registrarse en MVC.
ExceptionMessage = Error al crear el usuario - Excepción de identidad. Los errores fueron:
El nombre de usuario [email protected] no es válido, solo puede contener letras o dígitos.
Objeto de usuario
var newUser = new ApplicationUser {
UserName = user.Email,
Email = user.Email
};
IdentifyConfig.cs
public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context) {
var manager = new ApplicationUserManager(new UserStore<ApplicationUser>(context.Get<ApplicationDbContext>()));
// Configure validation logic for usernames
manager.UserValidator = new UserValidator<ApplicationUser>(manager) {
RequireUniqueEmail = true,
AllowOnlyAlphanumericUserNames = false
};
Intenté comentar AllowOnlyAlphanumericUserNames pero no funcionó. Al configurarlo correctamente en falso debería permitir caracteres especiales, en mi caso un guión (-).
Controlador API
// POST: api/auth/register
[ActionName("Register")]
public async Task<HttpResponseMessage> PostRegister(Auth user) {
//dash issue is here.
var userContext = new ApplicationDbContext();
var userStore = new UserStore<ApplicationUser>(userContext);
var userManager = new UserManager<ApplicationUser>(userStore);
var newUser = new ApplicationUser {
UserName = user.Email,
Email = user.Email
};
var result = await userManager.CreateAsync(newUser, user.PasswordHash);
if (result.Succeeded) {
...
Solución
NO hay cambios en IdentityConfig.cs . Solo cambios a mi controlador API.
// POST: api/auth/register
[ActionName("Register")]
public async Task<HttpResponseMessage> PostRegister(Auth user) {
//Changed to the following line
ApplicationUserManager userManager = HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>();
var newUser = new ApplicationUser {
UserName = user.Email,
Email = user.Email
};
var result = await userManager.CreateAsync(newUser, user.PasswordHash);
Esto se debe a que toda su configuración está en ApplicationUserManager
, que no está utilizando en su acción Web Api. En cambio, estás actualizando UserManager
, que usará los valores predeterminados para toda la validación y demás.