use existing login table with asp.net core identity service

user2325928

I have an existing live application with its own login table which has all the user info stored. Now we have decided to make a mobile app for part of the application. For that we have decided to use asp.net core identity service. What ever articles/blog/videos I have found they all show how to create a new DB and use identity tables. As for us, we cannot use the new identity tables and need to stick with our own login table as it has been used very much throughout the system and application is heavily dependent on it.

So, my question is, is there any way of using ASP.NET core identity with existing database system?

thanks heaps, Maulik

Jean

I do use tables from Identity, however they do not have the same name as the default one. I guess if you customize the fields definitions you could map most of your fields.

Map of an entity property to a column:

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

Below you will find extensions that you may use during the init of your builder. Note the "ToTable" method, which is used to override default table names.

    /// <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");
        });
    }

However this does not solve the authentication issue, just the mapping of tables. You will also need to customize the way the authentication is done (password check). However I am not sure of which gain you will get with identity as it seems you would have duplicated/uncompatible login strategies. You may have to keep one or the other.

Collected from the Internet

Please contact [email protected] to delete if infringement.

edited at
0

Comments

0 comments
Login to comment

Related

TOP Ranking

HotTag

Archive