具有特殊字符的ASP.NET MVC标识电子邮件/用户名

时间:2016-05-16 18:21:21

标签: c# asp.net asp.net-mvc asp.net-web-api asp.net-identity

通过 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);

2 个答案:

答案 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,然后将使用默认值进行所有验证等。