. NET Core UserManager CreateAsyn c оставляет имя пользователя / адрес электронной почты / номер телефона всегда нулевым - PullRequest
0 голосов
/ 19 января 2020

NET Базовое приложение, реализующее пользовательские IdentutyUser logi c для некоторых дополнительных полей.

Мне удалось создать пользователя, используя CreateAsync, но поля UserName, Email и PhoneNumber всегда игнорируются. Их нормализованные версии (NormalizedUserName, NormalizedEmail и NormalizedPhoneNumber (последняя была создана мной, поскольку любое необнуляемое значение должно быть уникальным)) создаются успешно, но всегда с большой буквы.

Код контроллера:

[HttpPost]
[AllowAnonymous]
[Route("Registration")]
public async Task<IActionResult> UserRegistration(ApplicationUserModel model)
{
    var applicationUser = new ApplicationUser()
    {
        UserName = model.UserName,
        Email = model.Email,
        PhoneNumber = model.PhoneNumber,
        FirstName = model.FirstName,
        // Other fields that are being inserted normally...
    };

    IdentityResult result = await _userManager.CreateAsync(applicationUser, model.Password);

    try
    {
        return Ok(result);
    }
    catch (Exception ex)
    {
        throw ex;
    }
}

Если это помогает проблемным полям c переопределяться классом ApplicationUser модели:

public class ApplicationUser : IdentityUser
{
    [Column("UserName", TypeName = "nvarchar(24)")]
    [Required(ErrorMessage = "UN_REQUIRED")]
    [StringLength(24, ErrorMessage = "UN_LENGTH", MinimumLength = 3)]
    [RegularExpression(@"[A-Za-z]+(?:[A-Za-z0-9-_])+(?:[_-]\w+)?$", ErrorMessage = "UN_INVALID")]
    public override string UserName { get; set; }

    [Column("Email", TypeName = "nvarchar(64)")]
    [Required(ErrorMessage = "EM_REQUIRED")]
    [StringLength(64, ErrorMessage = "EM_LENGTH", MinimumLength = 13)]
    [EmailAddress(ErrorMessage = "EM_INVALID")]
    public override string Email { get; set; }

    [Column("PhoneNumber", TypeName = "nvarchar(15)")]
    [Phone(ErrorMessage = "PN_INVALID")]
    public override string PhoneNumber { get; set; }

    ...
}

У меня также есть этот код в Startup.cs:

services.Configure<IdentityOptions>(options => {
    options.User.AllowedUserNameCharacters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_";
    options.User.RequireUniqueEmail = true;
    options.Password.RequireDigit = true;
    options.Password.RequireLowercase = true;
    options.Password.RequireUppercase = true;
    options.Password.RequiredLength = 8;
    options.Password.RequireNonAlphanumeric = false;
});

Что мне нужно сделать, чтобы вставить соответствующие значения в БД вместе с остальными?

1 Ответ

1 голос
/ 20 января 2020

После добавления пользовательских свойств вы должны использовать новые ApplicationUser в ConfigureServices:

services.AddDefaultIdentity<ApplicationUser>()
        .AddDefaultUI(UIFramework.Bootstrap4)
        .AddEntityFrameworkStores<ApplicationDbContext>();

И ApplicationDbContext:

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>

и подтвердить, что вы вводите UserManager с новым ApplicationUser в контроллере:

private readonly UserManager<ApplicationUser> _userManager;

Наконец Add-migration xx, update-database, чтобы позволить ef создавать столбцы в таблице AspNetUsers.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...