2016-05-16 17 views
6

Podczas rejestracji konta poprzez Web API za pomocą wiadomości e-mail, takiej jak "[email protected]", Fiddler zwraca następujący błąd. Pamiętaj, że adres e-mail jest również używany dla nazwy użytkownika, więc oba pola są takie same. Ale działa podczas rejestracji na samym MVC.ASP.NET MVC Identity Email/Username with Special Characters

ExceptionMessage = Niepowodzenie tworzenia użytkownika - Wyjątek tożsamości. Błędy:

Nazwa użytkownika [email protected] jest nieprawidłowa, może zawierać tylko litery lub cyfry.

obiektu użytkownika

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 

     }; 

Próbowałem zakomentowanie AllowOnlyAlphanumericUserNames ale to nie działa. Po ustawieniu tego ustawienia na false powinno zezwalać na znaki specjalne, w moim przypadku myślnik (-).

API Controller

// 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) { 
     ... 

Rozwiązanie

nie ma zmiany IdentityConfig.cs. Tylko zmiany dotyczą mojego kontrolera 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); 

Odpowiedz

10

ustawiania AllowOnlyAlphanumericUserNames = false w Create metody ApplicationUserManager. Wewnątrz akcji PostRegister Twojego ApiController tworzysz instancję ApplicationUserManager. AllowOnlyAlphanumericUserNames ma domyślnie wartość true.

Można zmienić konstruktor ApplicationUserManager

public ApplicationUserManager(IUserStore<ApplicationUser> store): base(store) 
{ 
     UserValidator = new UserValidator<ApplicationUser>(this) 
     { 
      AllowOnlyAlphanumericUserNames = false, 
      RequireUniqueEmail = true 
     }; 
} 

tamtędy AllowOnlyAlphanumericUserNames jest ustawiona na false, gdy nowy wystąpienie ApplicationUserManger.

Uwaga: że lepiej, aby uzyskać ApplicationUserManager z OwinContext samo jak to zrobiono w AccountController domyślnego szablonu MVC5 lub używać Dependency Injection.

+0

Dzięki za rozwiązanie! Postępowałem zgodnie z zaleceniami zawartymi w notatce. Zmieniłem moje pytanie, aby odzwierciedlić działające rozwiązanie. :) –

3

Dzieje się tak, ponieważ cała konfiguracja jest w ApplicationUserManager, której nie używa się w akcji Web Api. Zamiast tego wprowadzasz nowszą wersję: UserManager, która będzie używać wartości domyślnych dla wszystkich walidacji i innych.