SimpleMembership migration to Identity 2.0

This question has evolved, so I updated the title.

This was the original name: Identity 2 UserManager.Find throws "Invalid object name" Error dbo.ApplicationUser

I am switching from SimpleMembership to Identity 2. I have run the script conversion and reorganized various files to use Identity. I can create and run the application, but when I try to log into the system "Invalid object name" dbo.ApplicationUser error "var user = UserManager.Find (vM.UserName, vM.Password);

Account controller:

[RequireHttps] [Authorize] public class AccountController : Controller { private readonly IUserService _userService; public UserManager<ApplicationUser> UserManager { get; private set; } public AccountController() : this(new UserService(), new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new MyDb()))) { } public AccountController(IUserService userService, UserManager<ApplicationUser> userManager) { _userService = userService; UserManager = userManager; } // GET: /Account/Login [AllowAnonymous] public ActionResult Login() { return View(); } // POST: /Account/Login [HttpPost] [AllowAnonymous] [ValidateAntiForgeryToken] public ActionResult Login(LoginVm vM) { if (ModelState.IsValid) { var user = UserManager.Find(vM.UserName, vM.Password); if (user != null) { FormsAuthentication.SetAuthCookie(user.UserName, false); return RedirectToAction("Index", "Home"); } } ModelState.AddModelError("", "The user name or password provided is incorrect."); return View(vM); } 

ApplicationUser:

  public class ApplicationUser : IdentityUser { [StringLength(15)] public new string UserName { get; set; } public int AcId { get; set; } public int LcId { get; set; } public string ConfirmationToken { get; set; } public bool IsConfirmed { get; set; } public string PasswordResetToken { get; set; } } 

Dbcontext:

  public class MyDb : IdentityDbContext<ApplicationUser> // DbContext { public MyDb() : base("MyApplicaiton") { } // public virtual DbSet<UserProfiles> Users { get; set; } public virtual DbSet<MyTable> MyTables { get; set; } // properties marked virtual for Mocking override ... protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); modelBuilder.Entity<IdentityUserLogin>().HasKey<string>(l => l.UserId); modelBuilder.Entity<IdentityRole>().HasKey<string>(r => r.Id); modelBuilder.Entity<IdentityUserRole>().HasKey(r => new { r.RoleId, r.UserId }); } } 

Why is the user manager trying to access dbo. [ApplicationUser] (which does not exist), not dbo. [AspNetUsers]?

UPDATE 1: I switched to Microsoft.AspNet.Identity.EntityFramework 1.0 and Microsoft.AspNet.Identity.Core 1.0, and now I get the error "Invalid object name" dbo.IdentityUser "when calling UserManager.Find.

UPDATE 2:

I upgraded to Identity 2.0 and just saw what happens with the backup and delete the database and restore it first with the code (enable-migrations, update-database).

Instead of adding default Identity tables:
AspNetRoles
Aspnetclaims
AspNetUserLogins
AspNetUserRoles
Aspnetusers

He added these tables:
dbo.ApplicationUser
dbo.IdentityRole
dbo.IdentityUserClaim
dbo.IdentityUserLogin
dbo.IdentityUserRole

Which explains why it is looking for ApplicationUser. What is my configuration that forces these names instead of the standard Identity names? I could probably change my script migration to these names, but then I would get non-standard table names that would only lead to confusion in the future. How to configure items to get default name table names?

+6
asp.net-identity
Apr 28 '14 at 16:31
source share
1 answer

The problem with table names was related to the OverModelCreating override. My calls .Entity <...> (). HasKey called these table names. For more information on overrides, see Olav Nyb0 here: Asp.net authentication error . I updated OnModelCreating to:

 protected override void OnModelCreating(DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); } 

My ApplicationUser and migration script were modeled on Identity 1.0, and I needed to update them for Identity 2.0.

ApplicationUser:

  public class ApplicationUser : IdentityUser { public int AcId { get; set; } public int LcId { get; set; } } 

As a result of the script migration, I ended up working with my SimpleMembership database. A bit from the original question, but I turn it on here to hope to save someone else in the hours that I spent on it.

  /****** Object: Table [dbo].[AspNetRoles] Script Date: 4/29/14 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO IF OBJECT_ID('dbo.AspNetUserRoles', 'U') IS NOT NULL DROP TABLE [dbo].[AspNetUserRoles] GO --IF OBJECT_ID('dbo.AspNetUserLogins', 'U') IS NOT NULL -- DROP TABLE [dbo].[AspNetUserLogins] --GO IF OBJECT_ID('dbo.AspNetUserClaims', 'U') IS NOT NULL DROP TABLE [dbo].[AspNetUserClaims] GO IF OBJECT_ID('dbo.AspNetRoles', 'U') IS NOT NULL DROP TABLE [dbo].[AspNetRoles] GO IF OBJECT_ID('dbo.AspNetUsers', 'U') IS NOT NULL DROP TABLE [dbo].[AspNetUsers] GO CREATE TABLE [dbo].[AspNetUsers] ( [Id] NVARCHAR (128) NOT NULL, [UserName] NVARCHAR (15) NULL, [AcId] INT NOT NULL, [LcId] INT NOT NULL, [Email] NVARCHAR (256) NULL, [EmailConfirmed] BIT DEFAULT ((0)) NULL, [PasswordHash] NVARCHAR (MAX) NULL, [SecurityStamp] NVARCHAR (MAX) NULL, [PhoneNumber] NVARCHAR (MAX) NULL, [PhoneNumberConfirmed] BIT DEFAULT ((0)) NULL, [TwoFactorEnabled] BIT DEFAULT ((0)) NULL, [LockoutEndDateUtc] DATETIME NULL, [Lockoutenabled] BIT DEFAULT ((0)) NULL, [AccessFailedCount] INT DEFAULT ((0)) NOT NULL, [Discriminator] NVARCHAR (128) NOT NULL, [CreateDate] DATETIME NULL, [ConfirmationToken] NVARCHAR (128) NULL, [IsConfirmed] BIT DEFAULT ((0)) NULL, [LastPasswordFailureDate] DATETIME NULL, [PasswordFailuresSinceLastSuccess] INT DEFAULT ((0)) NULL, [PasswordChangedDate] DATETIME NULL, [PasswordVerificationToken] NVARCHAR (128) NULL, [PasswordVerificationTokenExpirationDate] DATETIME NULL, CONSTRAINT [PK_dbo.AspNetUsers] PRIMARY KEY CLUSTERED ([Id] ASC) ); GO CREATE TABLE [dbo].[AspNetRoles] ( [Id] NVARCHAR (128) NOT NULL, [Name] NVARCHAR (256) NOT NULL, CONSTRAINT [PK_dbo.AspNetRoles] PRIMARY KEY CLUSTERED ([Id] ASC) ); GO CREATE TABLE [dbo].[AspNetUserRoles] ( [UserId] NVARCHAR (128) NOT NULL, [RoleId] NVARCHAR (128) NOT NULL, CONSTRAINT [PK_dbo.AspNetUserRoles] PRIMARY KEY CLUSTERED ([UserId] ASC, [RoleId] ASC), CONSTRAINT [FK_dbo.AspNetUserRoles_dbo.AspNetRoles_RoleId] FOREIGN KEY ([RoleId]) REFERENCES [dbo].[AspNetRoles] ([Id]) ON DELETE CASCADE, CONSTRAINT [FK_dbo.AspNetUserRoles_dbo.AspNetUsers_UserId] FOREIGN KEY ([UserId]) REFERENCES [dbo].[AspNetUsers] ([Id]) ON DELETE CASCADE ); GO CREATE NONCLUSTERED INDEX [IX_RoleId] ON [dbo].[AspNetUserRoles]([RoleId] ASC); GO CREATE NONCLUSTERED INDEX [IX_UserId] ON [dbo].[AspNetUserRoles]([UserId] ASC); GO CREATE TABLE [dbo].[AspNetUserLogins] ( [UserId] NVARCHAR (128) NOT NULL, [LoginProvider] NVARCHAR (128) NOT NULL, [ProviderKey] NVARCHAR (128) NOT NULL, CONSTRAINT [PK_dbo.AspNetUserLogins] PRIMARY KEY CLUSTERED ([UserId] ASC, [LoginProvider] ASC, [ProviderKey] ASC), CONSTRAINT [FK_dbo.AspNetUserLogins_dbo.AspNetUsers_UserId] FOREIGN KEY ([UserId]) REFERENCES [dbo].[AspNetUsers] ([Id]) ON DELETE CASCADE ); GO CREATE NONCLUSTERED INDEX [IX_UserId] ON [dbo].[AspNetUserLogins]([UserId] ASC); GO CREATE TABLE [dbo].[AspNetUserClaims] ( [Id] INT IDENTITY (1, 1) NOT NULL, [ClaimType] NVARCHAR (MAX) NULL, [ClaimValue] NVARCHAR (MAX) NULL, [UserId] NVARCHAR (128) NOT NULL, CONSTRAINT [PK_dbo.AspNetUserClaims] PRIMARY KEY CLUSTERED ([Id] ASC), CONSTRAINT [FK_dbo.AspNetUserClaims_dbo.AspNetUsers_User_Id] FOREIGN KEY ([UserId]) REFERENCES [dbo].[AspNetUsers] ([Id]) ON DELETE CASCADE ); GO CREATE NONCLUSTERED INDEX [IX_User_Id] ON [dbo].[AspNetUserClaims]([UserId] ASC); GO INSERT INTO AspNetUsers(Id, UserName, BaId, OfcId, PasswordHash, SecurityStamp, Discriminator, CreateDate, ConfirmationToken, IsConfirmed, LastPasswordFailureDate, PasswordFailuresSinceLastSuccess, PasswordChangedDate, PasswordVerificationToken, PasswordVerificationTokenExpirationDate) SELECT UserProfile.UserId, UserProfile.UserName, UserProfile.BaId, UserProfile.OfcId, webpages_Membership.Password, webpages_Membership.PasswordSalt, 'User', CreateDate, ConfirmationToken, IsConfirmed, LastPasswordFailureDate, PasswordFailuresSinceLastSuccess, PasswordChangedDate, PasswordVerificationToken, PasswordVerificationTokenExpirationDate FROM UserProfile LEFT OUTER JOIN webpages_Membership ON UserProfile.UserId = webpages_Membership.UserId GO INSERT INTO AspNetRoles(Id, Name) SELECT RoleId, RoleName FROM webpages_Roles GO INSERT INTO AspNetUserRoles(UserId, RoleId) SELECT UserId, RoleId FROM webpages_UsersInRoles GO IF OBJECT_ID('dbo.webpages_OAuthMembership', 'U') IS NOT NULL DROP TABLE [dbo].[webpages_OAuthMembership] GO IF OBJECT_ID('dbo.webpages_UsersInRoles', 'U') IS NOT NULL DROP TABLE [dbo].[webpages_UsersInRoles] GO IF OBJECT_ID('dbo.webpages_Roles', 'U') IS NOT NULL DROP TABLE [dbo].[webpages_Roles] GO IF OBJECT_ID('dbo.UserProfile', 'U') IS NOT NULL DROP TABLE [dbo].[UserProfile] GO IF OBJECT_ID('dbo.webpages_Membership', 'U') IS NOT NULL DROP TABLE [dbo].[webpages_Membership] GO --INSERT INTO AspNetUserLogins(UserId, LoginProvider, ProviderKey) --SELECT UserId, Provider, ProviderUserId --FROM webpages_OAuthMembership --GO 

I do not use social logins, therefore commenting on the Insert tab in AspNetUserLogins (you need to create a table, although, as expected, Identity 2.0).

The Identity 2.0 AspNetUsers table has these fields by default:
[Id]
[Email]
[EmailConfirmed]
[PasswordHash]
[SecurityStamp]
[PhoneNumber]
[PhoneNumberConfirmed]
[TwoFactorEnabled]
[LockoutEndDateUtc]
[LockoutEnabled]
[AccessFailedCount]
[UserName]

I'm still experimenting, using your best opinion on what you need to migrate from the webpages_Membership table. At this point I can log in.

UPDATE:

In my ApplicationUser, I overridden UserName to shorten the field. Do not do this, this will result in an authentication error. You can control the length of the field in the migration script. I removed the override in OP. See Error User.IsInRole for more details .

ApplicationUser:

  public class ApplicationUser : IdentityUser { // [StringLength(15)] // do not override UserName, will cause authentication error. // public new string UserName { get; set; } public int AcId { get; set; } public int LcId { get; set; } // public string ConfirmationToken { get; set; } // Depends on your app if you need to migrate these fields // public bool IsConfirmed { get; set; } // public string PasswordResetToken { get; set; } } 
+2
Apr 29 '14 at 18:20
source share



All Articles