ASP.NET идентификатор удалить столбец из таблицы AspNetUsers

когда я использую ASP.NET подход Identity first code, я хочу генерировать столбцы в таблице AspNetUsers по-своему. Мне не нужно хранить несколько столбцов со значениями null. Мне просто нужны столбцы Id, SecurityStamp и имя пользователя. Только сообщение, которое я нашел здесь:AspNet Identity 2.0 дублирование электронной почты и имени пользователя , но он по-прежнему unsloved (из-за ошибки в Сантош комментарий).

Так может кто-нибудь сказать мне, как решить это?

EDIT: можно ли удалить некоторые из этих столбцов/свойства?

спасибо

4 ответов


короткий ответ: Нет, не без прокатки собственную реализацию. Или вы можете подождать, пока они откроют исходный код asp.net идентификация на сайте CodePlex. Кто знает, сколько времени это займет.

реализация по умолчанию включает все неиспользуемые столбцы (см. ниже).

// Summary:
//     Default EntityFramework IUser implementation
//
// Type parameters:
//   TKey:
//
//   TLogin:
//
//   TRole:
//
//   TClaim:
public class IdentityUser<TKey, TLogin, TRole, TClaim> : IUser<TKey>
    where TLogin : Microsoft.AspNet.Identity.EntityFramework.IdentityUserLogin<TKey>
    where TRole : Microsoft.AspNet.Identity.EntityFramework.IdentityUserRole<TKey>
    where TClaim : Microsoft.AspNet.Identity.EntityFramework.IdentityUserClaim<TKey>
{
    // Summary:
    //     Constructor
    public IdentityUser();

    // Summary:
    //     Used to record failures for the purposes of lockout
    public virtual int AccessFailedCount { get; set; }
    //
    // Summary:
    //     Navigation property for user claims
    public virtual ICollection<TClaim> Claims { get; }
    //
    // Summary:
    //     Email
    public virtual string Email { get; set; }
    //
    // Summary:
    //     True if the email is confirmed, default is false
    public virtual bool EmailConfirmed { get; set; }
    //
    // Summary:
    //     User ID (Primary Key)
    public virtual TKey Id { get; set; }
    //
    // Summary:
    //     Is lockout enabled for this user
    public virtual bool LockoutEnabled { get; set; }
    //
    // Summary:
    //     DateTime in UTC when lockout ends, any time in the past is considered not
    //     locked out.
    public virtual DateTime? LockoutEndDateUtc { get; set; }
    //
    // Summary:
    //     Navigation property for user logins
    public virtual ICollection<TLogin> Logins { get; }
    //
    // Summary:
    //     The salted/hashed form of the user password
    public virtual string PasswordHash { get; set; }
    //
    // Summary:
    //     PhoneNumber for the user
    public virtual string PhoneNumber { get; set; }
    //
    // Summary:
    //     True if the phone number is confirmed, default is false
    public virtual bool PhoneNumberConfirmed { get; set; }
    //
    // Summary:
    //     Navigation property for user roles
    public virtual ICollection<TRole> Roles { get; }
    //
    // Summary:
    //     A random value that should change whenever a users credentials have changed
    //     (password changed, login removed)
    public virtual string SecurityStamp { get; set; }
    //
    // Summary:
    //     Is two factor enabled for the user
    public virtual bool TwoFactorEnabled { get; set; }
    //
    // Summary:
    //     User name
    public virtual string UserName { get; set; }
}

на самом деле вы можете игнорировать поля, просто вам нужно настроить свою сущность OnModelCreating в вашем классе контекста как:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
        base.OnModelCreating(modelBuilder);
        modelBuilder.Entity<IdentityUser>().Ignore(c => c.AccessFailedCount)
                                           .Ignore(c=> c.LockoutEnabled)
                                           .Ignore(c=>c.LockoutEndDateUtc)
                                           .Ignore(c=>c.Roles)
                                           .Ignore(c=>c.TwoFactorEnabled);//and so on...

        modelBuilder.Entity<IdentityUser>().ToTable("Users");//to change the name of table.

}

на самом деле вы можете просто настроить свой объект на OnModelCreating вашего класса контекста.

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<IdentityUser>().Ignore(u => u.AccessFailedCount);
    //and so on...
}

или если ваше приложение имеет отдельный файл для каждой конфигурации (который я рекомендую), вы можете сделать так:

public class ApplicationUserEntityTypeConfiguration : EntityTypeConfiguration<ApplicationUser>
{
    public ApplicationUserEntityTypeConfiguration()
    {
        Ignore(p => p.AccessFailedCount);
        //And so on..
    }
}

Я знаю, что это может быть не полностью связано, но если вы просто хотите исключить столбцы в ответах JSON, все, что вам нужно сделать, это поместить [JsonIgnore] над свойством. Я использую Entity, поэтому по умолчанию (зашифрованный) пароль включен в модель. Даже если пароль зашифрован, вы все равно не хотите, чтобы его получил конечный пользователь. Один из способов сохранить доступ к этому свойству без включения его в ответ показан ниже.

В приведенном ниже примере пароль поле будет удалено из ответа Json, потому что мы добавили [JsonIgnore] модели.

public int Id { get; set; }
public string Email { get; set; }

[JsonIgnore]
public string Password { get; set; } // <--- Removed from JSON response

public string FirstName { get; set; }
public string MiddleName { get; set; }
public string LastName { get; set; }
public string PhoneNumber { get; set; }
public bool Active { get; set; }

вот пример ответа JSON.

{
  "id": 1,
  "email": "ddavis@example.com",
  "firstName": "Daniel",
  "middleName": "Cool-Guy",
  "lastName": "Davis",
  "phoneNumber": "12055550000",
  "active": true
}