Using Asp.Net Identity DataBase first approach

C#asp.net MvcEntity FrameworkIdentity

C# Problem Overview


I need to integrate Asp.Net latest MVC version with an existing database which has an additional column String Address to table dbo.AspNetUsers

I need to create an instance ApplicationUser which has property Address.

Any idea how to do it?

C# Solutions


Solution 1 - C#

A possible solution which works for me, basically I am able to integrate Asp.Net Identity User Profiles with an existing Database.

Getting the Asp.Identity Tables:

  • Create an MVC Project with Authentication Individual User Account
  • Open the DB listed under the DefaultConnection in Web.config. It will be called (aspnet-[timestamp] or something like that.)
  • Script the database tables using SQL Server Management Studio (attach database for mdc).

Alternatively use something like http://identity.codeplex.com/

Integrating with your existing db:

  • Insert the scripted tables into existing database in SQL Server Management Studio.
  • Customize and add relationships to ApplicationUser (if necessary).
  • Create new Web Project > MVC > DB First Project > Import DB with EF ... .
  • In IdentityModels.cs change the ApplicationDbContext :base("DefaltConnection") to use your project's DbContext.

Now you have the Asp.Identity Tables in your db with ER model in your application.

Asp.Identity Profile Adding new properties:

  • Enable Entity Framework Code First Database Migrations, just in VS go under Tools ‘Package Manager Console’,

  • Execute the command “Enable-Migrations”; Once we enabled the database migrations, we can go ahead and add new properties for our UserProfile

  • To Add new properties modify IdentityModels.cs file, example:


public class ApplicationUser : IdentityUser
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string EmailID { get; set; }
}

Add New Migration

  • Once we added the properties, bring the Package Manager Console and execute the following command.

    Add-Migration “YouMigrationName”

This command will generate a database script file, now execute following command to run this script file against the database.

Update-Database

Now, all the new properties will turn into table fields in the same database table.

I hope it can help others, if you have a better idea please let me know.

Solution 2 - C#

I have been successful in integrating an existing database via Database First with Identity Framework 2.0. I have written a blog post on it here which uses ASP.NET MVC 5, Identity Framework 2.0, and the SPA template from Visual Studio 2013 Update 2 RTM.

I hope this helps anyone in their journey because it contains a few points not listed in one place which I had to figure out on my own.

Solution 3 - C#

Take a look at these projects on GitHub:

Which includes:

  • SQL Database Project Template for ASP.NET Identity 2.0
  • Entity Framework Database-First Provider(s)
  • Source Code and Samples

enter image description here

Solution 4 - C#

I had recently the same problem. I had an apllication created with DBFirst aproach and I needed to add Identity. This is what I did.

  1. Install the next packages:

> 1. Microsoft.EntityFrameworkCore > 2. Microsoft.EntityFrameworkCore.Design > 3. Microsoft.EntityFrameworkCore.SqlServer > 4. Microsoft.AspNetCore.Identity > 5. Microsoft.AspNetCore.Identity.EntityFrameworkCore > 6. Microsoft.AspNetCore.Aututhentication.JwtBearer

  1. Do DbContext inherit from IdentityDbContext, like this:
public partial class BookStoresDBContext : IdentityDbContext
  1. OnModelCreating I called the base constructor in order to avoid an error like "'IdentityUserLogin' requires a primary key to be defined"
 protected override void OnModelCreating(ModelBuilder modelBuilder) {
     base.OnModelCreating(modelBuilder);
 }
  1. As far as it was a created project the StringConnection was already there, if not add it.

  2. On the Startup.cs configure Identity service on ConfigureServices


public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<BookStoresDBContext>(options => options.UseSqlServer(Configuration.GetConnectionString("BookStoreDB")));

    services.AddIdentity<IdentityUser, IdentityRole>(options =>
    {
        options.Password.RequireDigit = true;
        options.Password.RequiredLength = 5;
    
    }).AddEntityFrameworkStores<BookStoresDBContext>()
    .AddDefaultTokenProviders();

}

  1. You can configure the Authetication service too

    services.AddAuthentication(auth =>
    {
        auth.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
        auth.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
    }).AddJwtBearer(options => {
        options.TokenValidationParameters = new Microsoft.IdentityModel.Tokens.TokenValidationParameters
        {
            ValidateIssuer = true,
            ValidateAudience = true,
            RequireExpirationTime = true,
            IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("Your key to encrypt"))
        };
    });
    
  2. Then run the migration from the Package Manager Console

Add-Migration InitDb
  1. On the migration file, remove all the migrationBuilder.CreateTable for the tables you already have in your Database

  2. Update the Database from the Package Manager Console

Update-Database
  1. Then you will see the Identity Tables on your db

enter image description here

I hope it result usefull 

Solution 5 - C#

Don't forget to add migrations and update the database. Otherwise it throws a dependecy injection exceptions for the identity.

Solution 6 - C#

public class MyUser : IdentityUser { public virtual MyUserInfo MyUserInfo { get; set; } }

public class MyUserInfo{ 
    public int Id { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 
public class MyDbContext : IdentityDbContext<MyUserInfo> //Edited to MyUserInfo
{ 
    public MyDbContext() 
        : base("DefaultConnection") 
    { 
    } 
    public System.Data.Entity.DbSet<MyUserInfo> MyUserInfo { get; set; } 
 } 

Getting Profile information

When the User Logs in, you can display the profile information by doing the following Get the current logged in UserId, so you can look the user up in ASP.NET Identity system

var currentUserId = User.Identity.GetUserId(); 

Instantiate the UserManager in ASP.Identity system so you can look up the user in the system

var manager = new UserManager<MyUser>(new UserStore<MyUser>(new MyDbContext())); 

Get the User object

var currentUser = manager.FindById(User.Identity.GetUserId()); 

Get the profile information about the user

currentUser.MyUserInfo.FirstName 

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionGibboKView Question on Stackoverflow
Solution 1 - C#GibboKView Answer on Stackoverflow
Solution 2 - C#Daniel EagleView Answer on Stackoverflow
Solution 3 - C#Konstantin TarkusView Answer on Stackoverflow
Solution 4 - C#aaron aaron aaronView Answer on Stackoverflow
Solution 5 - C#Muhammed Mazlum OrhanView Answer on Stackoverflow
Solution 6 - C#Didi BitiniView Answer on Stackoverflow