4

使用 Identity 2.0 注册用户后,在数据库中创建了用户,Account 控制器中有代码用于创建身份并登录用户。这是我收到错误的时候。这是产生错误的代码:

var identity = await UserManager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie);

这是错误:

实体类型 IdentityRole 不是当前上下文模型的一部分。

我的模型如下所示:

namespace MyApp.Models
{
    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")
        {
        }
    }
}

MyUserManager在 Account 控制器中是这样创建的:

namespace MyApp.Controllers
{
    [Authorize]
    public class AccountController : BaseController
    {
        private UserManager<ApplicationUser> _userManager;

        public AccountController()
        {
        }

        public AccountController(UserManager<ApplicationUser> userManager)
        {
            UserManager = userManager;
        }

        public UserManager<ApplicationUser> UserManager
        {
            get
            {
                return _userManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new MyAppDb()));
            }
            private set
            {
                _userManager = value;
            }
        }

        ...
    }
}
4

1 回答 1

7

我在这个问题上花了很多时间,并发布了很多问题来深入了解它。我当然希望这些信息对其他人有所帮助。

基本上,自定义User很容易,并且有几个可用的示例。但是,自定义Role是有问题的,我发现的唯一示例是自定义的,远远超出了“开箱即用”的范围,并且在解决Id问题后我能够让一个工作正常。在那种情况下,问题是我必须Id自己创建。这是那个问题:UserManager.Create(user, password) thowing EntityValidationError 说 Id is required?

User因此,在简单的示例中,请注意,当您只是自定义DbContext继承自IdentityDbContext并且您只是提供 时IdentityUser,在我的情况下,它被调用ApplicationUser并且看起来像这样IdentityDbContext<ApplicationUser>。另请注意,UserManagerandUserStore也提供了IdentityUser,并且在大多数示例中看起来像这样new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext()))

但是,一旦您自定义了Role您需要传递的所有内容,包括字段TKey的键类型。Id我的看起来像这样IdentityDbContext<ApplicationUser, ApplicationRole, string, IdentityUserLogin, IdentityUserRole, IdentityUserClaim>,因为我只自定义了Userand Role

但是你还没有完成,因为常规UserManager不再理解了。我认为这是身份人员可以/应该解决的问题,但我离题了。所以我必须实现我自己的UserStoreUserManager注意(这是让我绊倒的部分)你必须在KType这里提供或者实例化你的自定义UserManager会给你一个编译时错误:

public class ApplicationUserStore : UserStore<ApplicationUser, ApplicationRole, string, IdentityUserLogin, IdentityUserRole, IdentityUserClaim>
{
    public ApplicationUserStore(MyAppDb context)
        : base(context)
    {
    }
}

public class ApplicationUserManager : UserManager<ApplicationUser, string>
{
    public ApplicationUserManager(IUserStore<ApplicationUser, string> store)
        : base(store)
    {
    }
}

UserManager并像这样在 Account 控制器中实例化new ApplicationUserManager(new ApplicationUserStore(new MyAppDb()))

public class AccountController : BaseController
{
    private ApplicationUserManager _userManager;

    public AccountController()
    {
    }

    public AccountController(ApplicationUserManager userManager)
    {
        UserManager = userManager;
    }

    public ApplicationUserManager UserManager
    {
        get
        {
            return _userManager = new ApplicationUserManager(new ApplicationUserStore(new MyAppDb()));
        }
        private set
        {
            _userManager = value;
        }
    }

    ...

}

希望这可以帮助!

于 2014-04-01T23:26:07.287 回答