簡體   English   中英

為什么 EF Core 2.2 總是更新“AspNetUsers”表中的“ConcurrencyStamp”、“PasswordHash”?

[英]Why EF Core 2.2 always updates "ConcurrencyStamp", "PasswordHash" in "AspNetUsers" table?

我有 .net 核心應用程序,它首先使用 ef 核心 2.2 代碼 model,當我運行時

添加遷移

它總是更新"AspNetUsers"表中的"ConcurrencyStamp", "PasswordHash"列值。

自動生成的UP方法內容為

        migrationBuilder.UpdateData(
            table: "AspNetUsers",
            keyColumn: "Id",
            keyValue: new Guid("b0bea27d-5eae-4836-8f85-8bf8f1aed8d5"),
            columns: new[] { "ConcurrencyStamp", "PasswordHash" },
            values: new object[] { "c599b745-8e24-438b-bd62-8264102ac960", "AQAAAAEAACcQAAAAEHjqRSJuPQtzpQR7L7hUNo3vFM8P9dhHkiXQjYRpdgS1Z9I9TXQ2XwhM9CQiE0oVyg==" });

        migrationBuilder.UpdateData(
            table: "AspNetUsers",
            keyColumn: "Id",
            keyValue: new Guid("b0bea27d-5eae-4836-8f85-8bf8f1aed8d6"),
            columns: new[] { "ConcurrencyStamp", "PasswordHash" },
            values: new object[] { "bdbc0bcf-6eaa-489b-b2a2-9c1742a38bf4", "AQAAAAEAACcQAAAAEBpVzPQl74gxL+V93biLDmn4oKNJSZZ5VDUpwSQ/S8h+itGvGbScqG78Wi35bmN4dQ==" });

我的OnModelCreating方法如下

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);

    modelBuilder.ApplyConfigurations(
        typeof(SampleDBContext).Assembly,
        typeof(IEntityTypeConfiguration<>));

    DatabaseSeeder.Seed(modelBuilder);
}

在種子方法中,我調用了一種方法來播種應用程序用戶。

    private static void SeedApplicationUser(ModelBuilder modelBuilder)
    {
        var hasher = new PasswordHasher<ApplicationUser>();

        var admin = new ApplicationUser
        {
            Id = Guid.Parse("b0bea27d-5eae-4836-8f85-8bf8f1aed8d4"),
            RoleType = RoleTypes.Admin,
            Email = "admin@gmail.io",
            NormalizedEmail = "ADMIN@GMAIL.IO",
            EmailConfirmed = true,
            UserName = "admin",
            NormalizedUserName = "ADMIN",
        };

        var user1 = new ApplicationUser
        {
            Id = Guid.Parse("b0bea27d-5eae-4836-8f85-8bf8f1aed8d5"),
            RoleType = RoleTypes.User,
            Email = "user1@gmail.io",
            NormalizedEmail = "USER1@GMAIL.IO",
            EmailConfirmed = true,
            UserName = "user1",
            AccessFailedCount = 0,
            NormalizedUserName = "USER1",
        };

        var user2 = new ApplicationUser
        {
            Id = Guid.Parse("b0bea27d-5eae-4836-8f85-8bf8f1aed8d6"),
            RoleType = RoleTypes.User,
            Email = "user2@gmail.io",
            NormalizedEmail = "USER2@GMAIL.IO",
            EmailConfirmed = true,
            UserName = "user2",
            AccessFailedCount = 0,
            NormalizedUserName = "USER2",
        };

        admin.PasswordHash = hasher.HashPassword(admin, "admin@23");
        user1.PasswordHash = hasher.HashPassword(user1, "user1@23");
        user2.PasswordHash = hasher.HashPassword(user2, "user2@23");

        modelBuilder.Entity<ApplicationUser>()
            .HasData(admin, user1, user2);
    }

這是正常行為還是我錯過了什么?

如果有人需要更多詳細信息,請發表評論。 我不知道要提供什么。

謝謝,

ConcurrencyStamp總是在創建新對象時生成。

public virtual string ConcurrencyStamp { get; set; } = Guid.NewGuid().ToString();

PasswordHash 它的值總是在你的種子中重新生成,並且總是不同的(即使是相同的密碼)。

這就是 EF Core 看到數據庫中數據和種子數據之間差異的原因。 每次創建新遷移時,這兩個字段的值都不同。

快速的解決方法,但不是最好的方法是始終使用相同的硬編碼哈希和並發標記,但這確實是錯誤的。

使用自定義初始化邏輯會更好,這在這個問題中有很好的描述: How to Seed an Admin user in EF Core 2.1.0?

根據微軟文檔:

如果您的方案包括以下任何一項,建議使用自定義初始化邏輯

  • 需要調用外部 API 的數據,例如ASP.NET 核心身份角色和用戶創建

https://docs.microsoft.com/en-us/ef/core/modeling/data-seeding#limitations-of-model-seed-data

但是,如果您必須這樣做並且需要阻止未來的遷移重新實例化哈希,那么您可以這樣做:

var admin = new ApplicationUser
{
    ...
    SecurityStamp = "_known_guid_1_",
    ConcurrencyStamp = "_known_guid_2_",
    PasswordHash = "_passwordhash_of_known_password_"
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM