【问题标题】:ASP.NET MVC Identity Email/Username with Special Characters带有特殊字符的 ASP.NET MVC 身份电子邮件/用户名
【发布时间】:2016-05-17 21:08:12
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    您在ApplicationUserManagerCreate 方法中设置AllowOnlyAlphanumericUserNames = false。 在ApiControllerPostRegister 操作中,您正在新建ApplicationUserManager 的实例。 AllowOnlyAlphanumericUserNames 默认为真。

    你可以更改ApplicationUserManager的构造函数

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

    这样,当您新建ApplicationUserManger 的实例时,AllowOnlyAlphanumericUserNames 将设置为 false。

    注意: 最好从OwinContext 中获取ApplicationUserManager,这与在默认MVC5 模板的AccountController 中所做的相同,或者使用依赖注入。

    【讨论】:

    • 感谢您的解决方案!我遵循了你在笔记中的建议。我已经编辑了我的问题以反映有效的解决方案。 :)
    【解决方案2】:

    那是因为您的所有配置都在 ApplicationUserManager 中,而您没有在 Web Api 操作中使用它。相反,您正在更新普通的UserManager,然后它将使用默认值进行所有验证等。

    【讨论】:

      猜你喜欢
      • 2010-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-15
      • 1970-01-01
      • 1970-01-01
      • 2014-10-23
      • 2014-10-20
      相关资源
      最近更新 更多