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; } }