通过 Web API 使用" xxx-yyy@gmail.com"等电子邮件注册帐户时,Fiddler会返回以下错误。 请注意,电子邮件也用于用户名,因此两个字段都相同。但是在注册MVC本身时它会起作用。
ExceptionMessage =用户创建失败 - 身份异常。错误是:
用户名xx-yyy@gmail.com无效,只能包含字母或数字。
用户对象
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
};
我试过评论 AllowOnlyAlphanumericUserNames ,但它没有用。通过将其设置为false应该允许特殊字符,在我的例子中是连字符( - )。
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) {
...
解决方案
IdentityConfig.cs 没有变化。只有更改是我的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);
答案 0 :(得分:11)
您正在使用AllowOnlyAlphanumericUserNames = false
Create
方法设置ApplicationUserManager
。
在您PostRegister
的{{1}}操作中,您正在新建ApiController
的实例。 <{1}}默认为true。
您可以更改ApplicationUserManager
AllowOnlyAlphanumericUserNames
当您新建ApplicationUserManager
的实例时,public ApplicationUserManager(IUserStore<ApplicationUser> store): base(store)
{
UserValidator = new UserValidator<ApplicationUser>(this)
{
AllowOnlyAlphanumericUserNames = false,
RequireUniqueEmail = true
};
}
设置为false。
注意:强>
最好从AllowOnlyAlphanumericUserNames
获取ApplicationUserManger
与默认MVC5模板的ApplicationUserManager
相同或使用依赖注入。
答案 1 :(得分:3)
这是因为您的所有配置都在ApplicationUserManager
中,您在Web Api操作中没有使用它。相反,您正在创建普通的UserManager
,然后将使用默认值进行所有验证等。