Как расширить IdentityUser с настраиваемым свойством

Я использую asp.net Identity 2.0 для входа на мой сайт, где данные аутентификации хранятся в базе данных SQL. Идентификация Asp.net была реализована стандартным способом, как это можно найти во многих онлайн-учебниках.

Класс ApplicationUser в IdentityModels был расширен для включения настраиваемого свойства:

public class ApplicationUser : IdentityUser
{
    public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager, string authenticationType)
    {
       CookieAuthenticationOptions.AuthenticationType
       var userIdentity = await manager.CreateIdentityAsync(this, authenticationType);
       return userIdentity;
    }
    //My extended property
    public string Code { get; set; }
}

Когда я регистрирую нового пользователя, я передаю Code настраиваемое свойство в RegisterBindingModel, но я не уверен, как вставить это настраиваемое свойство в таблицу WebUsers.

Я сделал это ниже, но на самом деле он не вставляет это свойство в таблицу вместе с именем пользователя и паролем.

var user = new ApplicationUser() { UserName = userName, Email = model.Email, Code=model.Code };

И вся функция:

[AllowAnonymous]
[Route("Register")]
public async Task<IHttpActionResult> Register(RegisterBindingModel model)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        var userName = !string.IsNullOrEmpty(model.UserName) ? model.UserName : model.Email;
        //I set it here but it doesn't get inserted to the table.
        var user = new ApplicationUser() { UserName = userName, Email = model.Email, Code=model.Code };

        IdentityResult result = await UserManager.CreateAsync(user, model.Password);

        if (!result.Succeeded)
        {
            return GetErrorResult(result);
        }

        return Ok();
    }

Что мне не хватает? Я смотрел на подобные вопросы, но не мог найти ответа для этого.

Ответ 1

Если вы выполните все шаги по добавлению пользовательского поля для пользователя, вы успешно завершите задачи.

Вот все шаги, чтобы добавить пользовательское поле для пользователя:

  1. Создайте веб-приложение ASP.NET
  2. Убедитесь, что вы выбрали MVC, а аутентификация - это индивидуальные учетные записи пользователей
  3. Перейдите в папку "Модели" → Откройте IdentityModels.cs → Класс ApplicationUser и добавьте свойство:

    public string Code { get; set; }
    
  4. Постройте проект
  5. Перейдите в меню ИНСТРУМЕНТЫ → Диспетчер пакетов Nuget → щелкните Консоль диспетчера пакетов
  6. Введите Enable-Migrations, нажмите Enter и дождитесь завершения задачи. Вы увидите ответ, который гласит:

       Checking if the context targets an existing database...
       Code First Migrations enabled for project WebApplication1.
    
  7. Введите Add-Migration "Code", нажмите Enter и дождитесь завершения задачи. Вы увидите ответ, который гласит:

    Scaffolding migration 'Code'. The Designer Code for this migration
    file includes a snapshot of your current Code First model. This
    snapshot is used to calculate the changes to your model when you
    scaffold the next migration. If you make additional changes to your
    model that you want to include in this migration, then you can
    re-scaffold it by running 'Add-Migration Code' again.
    
  8. Введите Update-Database, нажмите Enter и дождитесь завершения задачи. Вы увидите ответ, который гласит:

    Specify the '-Verbose' flag to view the SQL statements being applied 
    to the target database.
    Applying explicit migrations: [201611132135242_Code].
    Applying explicit migration: 201611132135242_Code.
    Running Seed method.
    

    На этом этапе, если вы обновите обозреватель объектов SQL Server и перейдете в базу данных и увидите таблицы, в разделе dbo.AspNetUsers в столбцах вы увидите поле Code. Если вы не знали, какую базу данных или даже какой сервер вам следует искать, откройте файл Web.Config и посмотрите строку подключения, которая выглядит примерно так:

    <add name="DefaultConnection" connectionString="Data Source=(LocalDb)\v11.0;AttachDbFilename=|DataDirectory|\aspnet-WebApplication1-20161114125903.mdf;Initial Catalog=aspnet-WebApplication1-20161114125903;Integrated Security=True"
    providerName="System.Data.SqlClient" />
    

    Вы можете увидеть источник данных (который является экземпляром сервера sql) и что-то .mdf, которое является именем базы данных.

  9. Перейдите в папку "Модели" → Откройте файл AccountViewModels.cs → Класс RegisterViewModel и добавьте это свойство: (В APIv2 с EF6 вы можете добавить следующую строку в папку "Модели" → файл AccountBindingModels → класс RegisterBindingModel)

    public string Code { get; set; }
    
  10. Перейдите в папку "Виды" → "Папка учетной записи" → откройте файл Register.cshtml и добавьте этот код рядом с другими полями, например, под паролем:

    <div class="form-group">
        @Html.LabelFor(m => m.Code, new { @class = "col-md-2 control-label" })
        <div class="col-md-10">
            @Html.TextBoxFor(m => m.Code, new { @class = "form-control" })
        </div>
    </div>
    
  11. Перейдите в папку "Контроллеры" → Откройте файл AccountController.cs → в действии "Регистрация http" измените строку, в которой создается пользователь:

    var user = new ApplicationUser { UserName = model.Email, Email = model.Email,
        Code= model.Code };
    
  12. Запустите проект и перейдите по ссылке /Account/Register и зарегистрируйте нового пользователя. После регистрации пользователя, если вы снова зайдете в базу данных и просмотрите данные таблицы dbo.AspNetUsers, вы увидите, что код был сохранен.

Скачать

Вы можете клонировать или скачать рабочий пример здесь:

Дополнительная информация: как добавить собственное свойство в IdentityRole?

Если вам интересно узнать, как добавить новое свойство в IdentityRole, посмотрите Как добавить собственное свойство в IdentityRole?

Ответ 2

Надеюсь, что это может помочь другим, так как оригинальный пост 1 + лет

Если вы уже создали проект с "Аутентификацией отдельных учетных записей пользователей:

В обозревателе решений перейдите в проект> Модели> IdentityModels.cs

под public class ApplicationUser: IdentityUser (должен быть первым классом).

Добавьте ваши пользовательские свойства после public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager) как в моем примере ниже:

public class ApplicationUser : IdentityUser
{
    public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
    {
        // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
        var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
        // Add custom user claims here
        return userIdentity;
    }
    **//add custom properties here - these are just examples**
    public bool SendEmails { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

Затем с помощью NuGet Packagemanager:

  • enable-migrations (если вы еще этого не сделали)
  • адд-миграция [ввод]
  • nameYourMigration [введите]
  • (просмотрите файл миграции, чтобы убедиться, что ваши свойства будут добавлены)
  • Обновление базы данных [введите]
  • Проверьте таблицу базы данных AspNetUsers, чтобы убедиться, что свойства были добавлены правильно.

Надеюсь, это поможет..

Ответ 3

Я думаю, что главная проблема по-прежнему в том, что вы не регистрируете новые заявки в классе ApplicationUser.

У меня была та же проблема, и я решил ее несколькими строками после CreateIdentityAsync.

public class ApplicationUser : IdentityUser
{
    public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager, string authenticationType)
    {
       CookieAuthenticationOptions.AuthenticationType
       var userIdentity = await manager.CreateIdentityAsync(this, authenticationType);

       // Add custom user claims here
        userIdentity.AddClaim(new Claim("Code",this.Code));
       return userIdentity;
    }
    //My extended property
    public string Code { get; set; }
}