2014-04-28 15 views
6

Bu soru gelişti, böylece başlığı güncelleştirdim. 2 UserManager.Find "Geçersiz nesne adı 'dbo.ApplicationUser'" hatasıSimpleMembership'i Kimlik 2.0'a Taşıma

Ben dönüşüm senaryoyu koştu ve ettik Kimlik 2. SimpleMembership dönüştürme ediyorum atar Kimlik:

Bu

orijinal başlık oldu Kimlik kullanımı için çeşitli dosyaları yeniden oluşturdu. Uygulamayı oluşturabilir ve çalıştırabilirim ancak "Geçersiz nesne adı 'dbo.ApplicationUser'" girişimi yapılmaya çalışıldığında var kullanıcıya = UserManager.Find (vM.UserName, vM.Password);

Hesap Denetleyici:

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

Neden kullanıcı yöneticisi Dbo erişmeye çalışıyor [ApplicationUser] (yok) dbo yerine [AspNetUsers]?

GÜNCELLEME 1: Ben Microsoft.AspNet.Identity.EntityFramework 1.0 ve Microsoft.AspNet.Identity.Core 1.0 döndürüldüğünü ve şimdi bir olsun "Geçersiz nesne adı 'dbo.IdentityUser'" hata UserManager.Find denir.

GÜNCELLEME 2:

Ben Kimlik 2.0'a geri yükseltilmiş ve sadece yedeklenmiş ne olacağını görmek için ve veritabanı silinir ve ilk kodla (enable-göçler, güncelleme-veritabanı) o rejenere.

yerine varsayılan Kimlik tabloları ekleyerek:
dbo.IdentityRole
Dbo
dbo.ApplicationUser:
AspNetUserRoles
AspNetUsers


AspNetRoles
AspNetClaims
AspNetUserLogins Bu tabloları eklendi .IdentityUserClaim
dbo.I dentityUserLogin
dbo.IdentityUserRole

Neden ApplicationUser aradığını açıklar. Standart Kimlik adları yerine bu adları zorlayan yapılandırmamla ilgili nedir? Muhtemelen göçmenlik senaryosunu bu isimlere değiştirebilirdim, ancak daha sonra ileriye doğru karışıklığa yol açacak standart olmayan tablo isimleriyle sonuçlanacağım. Varsayılan Kimlik tablosu adlarını almak için işleri nasıl yapılandırabilirim?

cevap

2

Tablo adlarıyla ilgili sorun, OnModelCreating uygulamasının geçersiz kılınmasıydı. Aramalarım. < ...>() HasKey bu tablo isimlerini çağırıyordu. Bu konuda daha fazla bilgi için Olav Nyb0'nun cevabına bakınız: Asp.net Identity Validation Error.Ben OnModelCreating güncelledik: Kimlik 1.0 üzerinde modellenmiştir

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

Benim ApplicationUser ve göç senaryo ve ben Kimlik 2.0 için bunları güncellemek için gerekli.

ApplicationUser:

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

İşte benim SimpleMembership veritabanıyla çalıştırmanızı ile sona erdi göç senaryo. Asıl sorudan biraz uzaktayım ama umarım bir başkasını kurtarabilmem için harcadığım saatleri umarım.

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

Ben dolayısıyla Sosyal oturumların AspNetUserLogins içine Ekle dışına yorumlama kullanmıyorum (eğer Kimlik 2.0 beri onu bekliyorsan olsa tablo oluşturmak gerekiyor).

Kimlik 2.0 AspNetUsers Tablo varsayılan olarak bu alanları vardır:
[İd]
[E-posta]
[EmailConfirmed]
[PasswordHash]
[SecurityStamp]
[TelefonNumarası]
[PhoneNumberConfirmed]
[TwoFactorEnabled]
[LockoutEndDateUtc]
[LockoutEnabled]
[AccessFailedCount]
[KullanıcıAdı] Hala deniyorum

, sen webpages_Membership tablosundan göç etmek gerekenler için olabildiğince özen. Bu noktada giriş yapabilirim.

GÜNCELLEME: Ben alanını kısaltmak için UserName geçersiz olduğu

benim ApplicationUser olarak. Bunu YAPMAYIN, bir kimlik doğrulama hatasına neden olur. Alan uzunluğunu geçiş komut dosyasında kontrol edebilirsiniz. OP'de geçersiz kılmayı kaldırdım. Daha fazla bilgi için bkz 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; } 
    }