7

我使用Identity2.0MVC5CodeFirst我已经延长两个IdentityUserIdentityRole这样的:从IdentityDbContext为什么UserManager.CreateIdentityAsync()正在寻找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继承,但我通过的ApplicationRole代替IdentityRole 。我的ApplicationRole继承自IdentityRole,所以这应该不成问题。在此代码

The entity type IdentityRole is not part of the model for the current context. 

UserManager.CreateIdentityAsync(...)

但是...

AccountController引发此错误

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

什么是“主要故障”? ;)

UPDATE: 我相当肯定的问题有事情做与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的时候,我只能将它传递一个论据?

+0

这可能是有益的注意,该项目的启动与AspNetIdentity1 *,然后升级到AspNetIdentity2.0。升级后,我扩展了IdentityRole,更改了MyAppDb的签名,正如您在上面的问题中所看到的,问题开始了。 –

+0

您的'user'是否有任何与其关联的'Roles'。如果是,请说明'用户'是如何创建的。 – haim770

+0

是的。我创建了这样的用户: var result = await UserManager.CreateAsync(user,model.Password); 其中“用户”是ApplicationUser。我直接在数据库中将用户添加到角色,从Users表中复制UserId,并从Roles表中复制RoleId。非常直截了当。 –

回答

12

我通过创建一个ApplicationUserStoreApplicationUserManager解决了这个问题:

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; 
    } 
} 
+1

也适用于我,但您可以使用'ApplicationUserStore:UserStore '来保存最后三个派生。 – ChrFin

相关问题