【发布时间】:2014-05-05 12:59:40
【问题描述】:
我使用 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?
【问题讨论】:
-
请注意这个项目从 AspNetIdentity1.* 开始,然后升级到 AspNetIdentity2.0,这可能会有所帮助。升级后,我扩展了 IdentityRole,更改了 MyAppDb 的签名,正如您在我的问题中看到的那样,问题就开始了。
-
您的
user是否有与之关联的Roles。如果是,请说明user是如何创建的。 -
是的。我这样创建了用户: var result = await UserManager.CreateAsync(user, model.Password);其中“用户”是 ApplicationUser。我直接在数据库中将用户添加到角色中,从用户表中复制用户 ID,从角色表中复制角色 ID。非常直接。
-
我提到了
ApplicationUser user。 -
传递给
SignInAsync方法的ApplicationUser user参数,它是如何创建的?
标签: asp.net-mvc entity-framework asp.net-mvc-5 entity-framework-6 asp.net-identity