Asp.net-Mvc
為什麼 UserManager.CreateIdentityAsync() 正在尋找 IdentityRole 以及如何解決?
我將Identity2.0與MVC5 CodeFirst 一起使用,我已經擴展了
IdentityUser和 ,IdentityRole如下所示:public class ApplicationUser : IdentityUser { [Required] [StringLength(50)] public string FirstName { get; set; } [Required] [StringLength(50)] public string LastName { get; set; } } public class ApplicationRole : IdentityRole { [Required] [StringLength(50)] public string ProperName { get; set; } [Required] public string Description { get; set; } } public class MyAppDb : IdentityDbContext<ApplicationUser, ApplicationRole, string, IdentityUserLogin, IdentityUserRole, IdentityUserClaim> { public MyAppDb() : base("MyAppDb") { } }注意
MyAppDb繼承自,IdentityDbContext但我傳遞了一個ApplicationRole而不是IdentityRole. 我的ApplicationRole繼承,IdentityRole所以這不應該是一個問題。但…
我
AccountController正在拋出這個錯誤:The entity type IdentityRole is not part of the model for the current context.在
UserManager.CreateIdentityAsync(...)此程式碼中:private async Task SignInAsync(ApplicationUser user, bool isPersistent) { AuthenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie); var identity = await UserManager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie); AuthenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = isPersistent }, identity); }
user正在這裡創建:var user = await UserManager.FindAsync(model.UserName, model.Password); if (user != null) { await SignInAsync(user, model.RememberMe); return RedirectToLocal(returnUrl); }什麼是“重大故障”?;)
更新: 我很確定這個問題與
UserStore這裡有關:public class AccountController : Controller { public AccountController () : this(new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new MyAppDb()))) { } public AccountController (UserManager<ApplicationUser> userManager) { UserManager = userManager; UserManager.PasswordValidator = (IIdentityValidator<string>)new MinimumLengthValidator(8); UserManager.UserValidator = new UserValidator<ApplicationUser>(UserManager) { AllowOnlyAlphanumericUserNames = false }; } public UserManager<ApplicationUser> UserManager { get; private set; } ...我如何
UserStore知道ApplicationRole何時只能通過一個參數?
我通過創建一個
ApplicationUserStoreand解決了這個問題ApplicationUserManager:public class ApplicationUser : IdentityUser<string, ApplicationUserLogin, ApplicationUserRole, ApplicationUserClaim> { [Required] [StringLength(50)] public string FirstName { get; set; } [Required] [StringLength(50)] public string LastName { get; set; } public async Task<ClaimsIdentity> GenerateUserIdentityAsync(ApplicationUserManager manager) { // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie); // Add custom user claims here return userIdentity; } } public class ApplicationUserLogin : IdentityUserLogin<string> { } public class ApplicationUserClaim : IdentityUserClaim<string> { } public class ApplicationUserRole : IdentityUserRole<string> { } public class ApplicationRole : IdentityRole<string, ApplicationUserRole> { [Required] [StringLength(50)] public string ProperName { get; set; } } public class MyAppDb : IdentityDbContext<ApplicationUser, ApplicationRole, string, ApplicationUserLogin, ApplicationUserRole, ApplicationUserClaim> { public static MyAppDb Create() { return new MyAppDb(); } public MyAppDb() : base("MyAppDb") { } } public class ApplicationUserStore : UserStore<ApplicationUser, ApplicationRole, string, ApplicationUserLogin, ApplicationUserRole, ApplicationUserClaim> { public ApplicationUserStore(MyAppDb context) : base(context) { } } public class ApplicationUserManager : UserManager<ApplicationUser, string> { public ApplicationUserManager(IUserStore<ApplicationUser, string> store) : base(store) { } public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options) { var manager = new ApplicationUserManager(new ApplicationUserStore(new MyAppDb())); // Configure the application user manager manager.UserValidator = new UserValidator<ApplicationUser>(manager) { AllowOnlyAlphanumericUserNames = false, RequireUniqueEmail = true }; manager.PasswordValidator = (IIdentityValidator<string>)new MinimumLengthValidator(8); return manager; } } public class ApplicationRoleStore : RoleStore<ApplicationRole, string, ApplicationUserRole> { public ApplicationRoleStore(MyAppDb context) : base(context) { } } public class ApplicationRoleManager : RoleManager<ApplicationRole, string> { public ApplicationRoleManager(IRoleStore<ApplicationRole, string> store) : base(store) { } public static ApplicationRoleManager Create(IdentityFactoryOptions<ApplicationRoleManager> options) { var manager = new ApplicationRoleManager(new ApplicationRoleStore(new MyAppDb())); return manager; } }