Не делайте имя пользователя уникальным для asp.net - PullRequest
0 голосов
/ 24 мая 2018

Я хочу реализовать собственную логику для проверки имени пользователя.Создана функция ValidateEntity для пользовательской проверки имени пользователя, но если я предоставляю уникальное имя пользователя при создании пользователя, тогда срабатывает функция ValidateEntity, а если я предоставляю повторяющееся имя пользователя, то эта функция не вызывается.

IdentityModel.cs

    public class ApplicationUser : IdentityUser
        {
            public int AppId { get; set; }
            //other attributes
            public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
            {
                var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
                return userIdentity;
            }
        }
    public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
        {
            public ApplicationDbContext()
                : base("DefaultConnection", throwIfV1Schema: false)
            {
            }

            public static ApplicationDbContext Create()
            {
                return new ApplicationDbContext();
            }

            protected override DbEntityValidationResult ValidateEntity(DbEntityEntry entityEntry, IDictionary<object, object> items)
            {
                if ((entityEntry != null) && (entityEntry.State == EntityState.Added))
                {
                    var user = entityEntry.Entity as ApplicationUser;
                    //custom logic for username validation
                }
                return base.ValidateEntity(entityEntry, items);
            }
        }

В AccountController.cs

public async Task<ActionResult> Register(RegisterViewModel model)
        {
            if (ModelState.IsValid)
            {
                var user = new ApplicationUser { UserName = model.Email, Email = model.Email };
                var result = await UserManager.CreateAsync(user, model.Password); //shouldn't it always goto ValidateEntity function?
                if (result.Succeeded)
                {
                    await SignInManager.SignInAsync(user, isPersistent:false, rememberBrowser:false);
                    return RedirectToAction("Index", "Home");
                }
                AddErrors(result);
            }
            return View(model);
        }

Обновление: Я добавил public new string UserName { get; set; } и теперь получаю ошибку Name cannot be null or empty здесь снимок экрана данных.

enter image description here

1 Ответ

0 голосов
/ 25 мая 2018

Не рекомендуется, чтобы поле имени пользователя не было уникальным, если только вы не планируете включить это в свой пользовательский валидатор.Однако вы должны иметь возможность переопределить поле имени пользователя в классе ApplicationUser:

public class ApplicationUser : IdentityUser
{
    public int AppId { get; set; }

    // Override username field
    public new string UserName { get; set; }

    //other attributes
    public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
    {
        var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
        return userIdentity;
    }
}

Кроме того, если ваша база данных уже существует, вы должны также не забудьте удалить уникальный индекс UserNameIndex, чтобы все работало.

...