asp.net-identity – 将SimpleMembership迁移到Identity 2.0
这个问题已经发展,所以我更新了标题.
这是原始标题: 我正在从SimpleMembership转换为Identity 2.我已经运行了转换脚本并重构了各种文件以供Identity使用.我可以构建并运行应用程序但是当尝试登录“无效对象名称’dbo.ApplicationUser’”时会抛出错误 账户管理员: [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 }); } } 为什么用户管理器试图访问dbo.[ApplicationUser](不存在)而不是dbo.[AspNetUsers]? 更新1: 更新2: 我升级回Identity 2.0,只是为了查看备份和删除数据库会发生什么,并首先使用代码重新生成它(enable-migrations,update-database). 而不是添加默认的身份表: 它添加了这些表格: 这可以解释为什么它正在寻找ApplicationUser.我的配置是什么强制这些名称而不是标准的身份名称?我可能可以将我的迁移脚本更改为这些名称,但最后我会得到非标准的表名,这只会导致混乱.如何配置以获取默认的标识表名称? 解决方法
表名的问题在于覆盖OnModelCreating.我调用.Entity< ...>().HasKey正在调用这些表名.有关覆盖的更多信息,请参阅Olav Nyb0的答案:
Asp.net Identity Validation Error.我已将OnModelCreating更新为:
protected override void OnModelCreating(DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); } 我的ApplicationUser和迁移脚本是在Identity 1.0上建模的,我需要为Identity 2.0更新它们. ApplicationUser: public class ApplicationUser : IdentityUser { public int AcId { get; set; } public int LcId { get; set; } } 这是我最终的迁移脚本,我在SimpleMembership数据库上运行.有点偏离原来的问题,但我把它包括在这里,希望能节省别人花费的时间来计算它. /****** 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',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 我没有使用社交登录因此注释掉插入AspNetUserLogins(你确实需要创建表,因为Identity 2.0期待它). Identity 2.0 AspNetUsers表默认包含以下字段: 我还在尝试,根据你在webpages_Membership表中迁移的内容,使用你最好的判断.此时我可以登录了. 更新: 在我的ApplicationUser中,我重写了UserName以缩短字段.不要这样做,它会导致身份验证错误.您可以在迁移脚本中控制字段长度.我删除了OP中的覆盖.欲了解更多,请参阅User.IsInRole failing. 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; } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-mvc – Azure下载blob文件流/ memorystream
- ASP.NET MVC 4将模型从视图传递给html帮助器
- asp.net – IIS 8.0中内核模式和用户模式缓存之间的区别
- asp.net – JObject.Parse与JsonConvert.DeserializeObject
- asp.net-mvc – ASP.NET MVC MultiSelectList,其中所选值未
- asp.net – web.config中的maxRequestLength发生内部错误
- asp.net-identity – 将SimpleMembership迁移到Identity 2.
- asp.net-mvc – 用ASP.NET MVC实现MEF?
- asp.net-mvc – 如何从ActionResult获取模型?
- ASP.NET – 脚本和css压缩
- asp.net – linq to sql update standard
- .net – Real Life与SOLID开发合作
- asp.net-mvc – 每个请求DbContext发生随机错误
- asp.net-mvc – 为什么在视图引擎中指定位置时,v
- 使用HtmlAnchor或ASP.NET HyperLink作为导航页内
- asp.net-mvc – 带有并发检查的ASP.NET MVC实体框
- asp.net-mvc – ASP.NET MVC:模型与MembershipU
- asp.net-web-api – 具有Web Api RC的Ninject In
- 在ASP.NET MVC(视图)中包含WebForms?
- ASP.NET和System.Diagnostics跟踪 – 我错过了什