簡體   English   中英

將現有登錄表與 asp.net 核心身份服務一起使用

[英]use existing login table with asp.net core identity service

我有一個現有的實時應用程序,它有自己的登錄表,其中存儲了所有用戶信息。 現在我們決定為應用程序的一部分制作一個移動應用程序。 為此,我們決定使用 asp.net 核心身份服務。 我發現的所有文章/博客/視頻都展示了如何創建新數據庫和使用身份表。 對於我們來說,我們不能使用新的身份表,需要堅持使用我們自己的登錄表,因為它在整個系統中使用得非常多,並且應用程序嚴重依賴它。

所以,我的問題是,有沒有辦法在現有數據庫系統中使用 ASP.NET 核心標識?

謝謝堆,毛利克

我確實使用了 Identity 中的表,但是它們的名稱與默認名稱不同。 我想如果您自定義字段定義,您可以映射大部分字段。

實體屬性到列的映射:

b.Property<long>(u => u.Id).HasColumnName("MyIdColumn")

您將在下面找到您在構建器初始化期間可能使用的擴展。 請注意“ToTable”方法,該方法用於覆蓋默認表名稱。

    /// <summary>
    /// Init MS.Identity tables + custom AppUser table
    /// </summary>
    public static void InitIdentity(this ModelBuilder builder, string tablesPrefix = "Identity_")
    {
        builder.InitBaseIdentity(tablesPrefix);
        builder.Entity<IdentityUserRole<long>>(b => b.ToTable($"{tablesPrefix}UserRoles"));
        builder.Entity<AppRole>(b => b.ToTable($"{tablesPrefix}Roles"));
        builder.Entity<IdentityRoleClaim<long>>(b => b.ToTable($"{tablesPrefix}RoleClaims"));

    }

    public static void InitBaseIdentity(this ModelBuilder builder, string tablesPrefix = "Identity_")
    {
        builder.Entity<IdentityUserLogin<long>>(b => b.ToTable($"{tablesPrefix}UserLogins"));
        builder.Entity<IdentityUserClaim<long>>(b => b.ToTable($"{tablesPrefix}UserClaims"));
        builder.Entity<AppUser>(b =>
        {
            b.ToTable($"{tablesPrefix}Users");
            b.Property<long>(u => u.Id).ValueGeneratedNever();
            b.Property<int>(u => u.AccessFailedCount);
            b.Property<string>(u => u.ConcurrencyStamp).IsConcurrencyToken();
            b.Property<string>(u => u.Email).HasAnnotation("MaxLength", 256);
            b.Property<bool>(u => u.EmailConfirmed);
            b.Property<bool>(u => u.LockoutEnabled);
            b.Property<DateTimeOffset?>(u => u.LockoutEnd);
            b.Property<string>(u => u.NormalizedEmail).HasAnnotation("MaxLength", 256);
            b.Property<string>(u => u.NormalizedUserName).HasAnnotation("MaxLength", 256);
            b.Property<string>(u => u.PasswordHash);
            b.Property<string>(u => u.PhoneNumber);
            b.Property<bool>(u => u.PhoneNumberConfirmed);
            b.Property<string>(u => u.SecurityStamp);
            b.Property<bool>(u => u.TwoFactorEnabled);
            b.Property<string>(u => u.UserName).HasAnnotation("MaxLength", 256);
            b.HasKey(u => u.Id);
            b.HasIndex(e => e.NormalizedEmail).HasName("EmailIndex");
            b.HasIndex(e => e.NormalizedUserName).HasName("UserNameIndex").IsUnique();
            b.Property(u => u.About).HasMaxLength(255);
            b.Property(u => u.Birthdate);
            b.Property(e => e.CountryCode).IsRequired().HasColumnType("char(2)");
            b.Property(u => u.Country).HasMaxLength(50);
            b.Property(u => u.FirstName).HasMaxLength(50);
            b.Property(u => u.LastName).HasMaxLength(50);
            b.Property(u => u.Gender);

            b.Property(e => e.CreationDate).HasColumnType("datetime").HasDefaultValueSql("getutcdate()");
            b.Property(e => e.LastUpdate).HasColumnType("datetime").HasDefaultValueSql("getutcdate()");
        });
        builder.Entity<IdentityUserToken<long>>(b =>
        {
            b.Property<long>(u => u.UserId);
            b.Property<string>(u => u.LoginProvider);
            b.Property<string>(u => u.Name);
            b.Property<string>(u => u.Value);
            b.HasKey(nameof(IdentityUserToken<long>.UserId), nameof(IdentityUserToken<long>.LoginProvider), nameof(IdentityUserToken<long>.Name));
            b.ToTable($"{tablesPrefix}UserTokens");
        });
    }

但是,這並不能解決身份驗證問題,只能解決表的映射問題。 您還需要自定義完成身份驗證的方式(密碼檢查)。 但是,我不確定您將通過身份獲得哪些收益,因為您似乎擁有重復/不兼容的登錄策略。 您可能必須保留其中一個。

您可以使用數據庫第一種方式。 您必須創建與數據庫表匹配的模型並創建 DbContext。

以下頁面演示了如何實現它的示例:

https://docs.microsoft.com/en-us/ef/core/get-started/aspnetcore/existing-db

暫無
暫無

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

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