Asp.net-Mvc

為什麼 UserManager.CreateIdentityAsync() 正在尋找 IdentityRole 以及如何解決?

  • April 1, 2014

我將Identity2.0MVC5 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;
   }
}

引用自:https://stackoverflow.com/questions/22672622