When registering an account through Web API with an email such as "[email protected]", Fiddler returns the follow error. Note that email is used for username as well, so both fields are the same. But it works when registering on MVC itself.
ExceptionMessage=User Creation Failed - Identity Exception. Errors were:
User name [email protected] is invalid, can only contain letters or digits.
User Object
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
};
I have tried commenting out AllowOnlyAlphanumericUserNames but it didn't work. By right setting it to false should allow special characters, in my case a hyphen(-).
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) {
...
Solution
There is NO changes to IdentityConfig.cs. Only changes is to my API Controller.
// 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);
You are setting AllowOnlyAlphanumericUserNames = false
in Create
method of ApplicationUserManager
.
Inside the PostRegister
action of your ApiController
you are newing an instance of ApplicationUserManager
. AllowOnlyAlphanumericUserNames
is true by default.
You can change the Constructor of ApplicationUserManager
public ApplicationUserManager(IUserStore<ApplicationUser> store): base(store)
{
UserValidator = new UserValidator<ApplicationUser>(this)
{
AllowOnlyAlphanumericUserNames = false,
RequireUniqueEmail = true
};
}
That way AllowOnlyAlphanumericUserNames
is set to false when you new an instance of ApplicationUserManger
.
Note:
Its better to get the ApplicationUserManager
from OwinContext
same as done in AccountController
of default MVC5 template or use Dependency Injection.
That's because all your config is in ApplicationUserManager
, which you aren't using in your Web Api action. Instead, you're newing up plain-old UserManager
, which will then use the defaults for all the validation and such.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With