2014-04-28 23 views
6

Diese Frage wurde weiterentwickelt, damit ich den Titel aktualisiert habe.Migrieren von SimpleMembership zu Identity 2.0

Dies war der ursprüngliche Titel: Identität 2 UserManager.Find „Ungültige Objektnamen‚dbo.ApplicationUser‘“ Fehler

Ich bin von SimpleMembership Identity Umwandlung 2. ich das Conversion-Skript habe lief wirft und die verschiedenen Dateien für die Identity-Nutzung überarbeitet. Ich kann die App erstellen und ausführen, aber beim Versuch, mich anzumelden, wird ein Fehler "Ungültiger Objektname 'dbo.ApplicationUser'" auf ausgelöst var user = UserManager.Find (vM.UserName, vM.Password);

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

Warum versucht Benutzermanager dbo zuzugreifen [ApplicationUser] (die es nicht gibt) anstatt dbo. [AspNetUsers]?

UPDATE 1: ich Microsoft.AspNet.Identity.EntityFramework herabgestuft 1,0 und 1,0 Microsoft.AspNet.Identity.Core und ich jetzt ein „Ungültige Objektnamen‚dbo.IdentityUser‘“ Fehlermeldung erhalten, wenn UserManager.Find wird genannt.

UPDATE 2:

ich zurück in Identity 2.0 aufgerüstet und nur um zu sehen, was die Datenbank wäre, gesichert und gelöscht und regeneriert es mit Code zuerst (enable-Migrationen, update-Datenbank).

Statt die Standard Identität der Zugabe von Tabellen:
AspNetRoles
AspNetClaims
AspNetUserLogins
AspNetUserRoles
AspNetUsers

Hinzuzufügen diese Tabellen:
dbo.ApplicationUser
dbo.IdentityRole
dbo .IdentityUserClaim
dbo.I dentityUserLogin
dbo.IdentityUserRole

Welches würde erklären, warum es ApplicationUser sucht. Was ist mit meiner Konfiguration, die diese Namen anstelle der standardmäßigen Identitätsnamen erzwingt? Ich könnte wahrscheinlich mein Migrations-Skript in diese Namen ändern, aber dann würde ich mit nicht standardmäßigen Tabellennamen enden, die nur zu Verwirrung führen würden. Wie konfiguriere ich Dinge, um die standardmäßigen Identitätstabellennamen zu erhalten?

Antwort

2

Das Problem mit den Tabellennamen war mit der Überschreibung von OnModelCreating. Meine Aufrufe an .Entity < ...>(). HasKey hat diese Tabellennamen aufgerufen. Für mehr auf die Überschreibung siehe Olav Nyb0's Antwort hier: Asp.net Identity Validation Error.Ich habe das OnModelCreating aktualisiert:

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

Mein ApplicationUser und Migrationsskript wurden auf Identität modelliert 1.0 und ich brauchte sie für Identity 2.0 zu aktualisieren.

ApplicationUser:

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

Hier ist die Migration Skript, das ich mit, dass ich gegen meine SimpleMembership Datenbank ausgeführt landete. Ein bisschen abseits der ursprünglichen Frage, aber ich nehme es hier auf, um hoffentlich anderen die Stunden zu ersparen, die ich damit verbracht habe, es herauszufinden.

/****** 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 

Ich bin nicht Social Logins daher die Kommentierung von Insert in AspNetUserLogins verwenden (Sie müssen die Tabelle erstellen, obwohl seit Identity 2.0 wird erwartet).

Die Identity 2.0 AspNetUsers Tabelle hat diese Felder standardmäßig:
[Id]
[Email]
[EmailConfirmed]
[PasswordHash]
[SecurityStamp]
[Phone]
[PhoneNumberConfirmed]
[TwoFactorEnabled]
[LockoutEndDateUtc]
[LockoutEnabled]
[AccessFailedCount]
[Benutzername]

ich immer noch experimentieren bin, verwenden Sie am besten Urteil darüber, was Sie von der webpages_Membership Tabelle migrieren müssen. An dieser Stelle kann ich mich aber einloggen.

UPDATE:

In meinem ApplicationUser ich den Benutzernamen außer Kraft gesetzt hatte, das Feld zu verkürzen. Tun Sie dies NICHT, es wird einen Authentifizierungsfehler verursachen. Sie können die Feldlänge im Migrationsskript steuern. Ich habe den Override im OP entfernt. Weitere sehen 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; } 
    } 
Verwandte Themen