在Identity 2.0中扩展Identity UserRole



因此,我的系统要求角色具有相关的到期日期。我已经实现了Identity 2.0框架,事情进展顺利,但我遇到了一个让我怀疑我的结构的问题。

public class ApplicationUserRole : IdentityUserRole
{
    public override string UserId { get; set; }
    public override string RoleId { get; set; }
    public DateTime Expiry { get; set; }
}
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public ApplicationDbContext()
        : base("DefaultConnection", throwIfV1Schema: false)
    {
    }
    static ApplicationDbContext()
    {
        Database.SetInitializer<ApplicationDbContext>(null);
    }
    public static ApplicationDbContext Create()
    {
        return new ApplicationDbContext();
    }
    public DbSet<ApplicationUserRole> ApplicationUserRoles { get; set; }
}

它改变了AspNetUserRoles表,从而添加了第三列,它是一个名为Expiry的DateTime。我可以使用ApplicationDBContext添加、更新和删除expiries,在编辑用户时一切都很好。

这个问题出现在创建帐户上。UserManager调用AddToRolesAsync,但只接受两个参数,User和Role。我需要它来接受用户、角色和过期。

我需要实现自己的UserManager吗?这似乎有些过头了。

我可以通过不允许在创建帐户时选择角色/到期日来解决这个问题,并将其保留为编辑模式。但我真的希望能够同时创建帐户和分配角色/任期。

看看下面关于使用现有数据库表使用asp.net标识的视频教程。我认为您必须让ApplicationUser表知道您的ApplicationUserRole表中有新字段。因此,您必须遵循实体框架模型绑定才能实现这一点。

第1部分-https://www.youtube.com/watch?v=elfqejow5hM

第2部分-https://www.youtube.com/watch?v=JbSqi3Amatw

你不需要实现自己的userManager,但你必须修改它。希望你能用这个例子来支持你的需求。

我知道这个问题已经得到了回答,但如果有人感兴趣的话,我没有使用UserManager.AddToRolesAsync,而是循环使用新角色,并使用UserRole.Add()方法;像这样:

var user = db.Users.Find(userId);
foreach (string roleName in newRoles) {
    string roleId = RoleManager.FindByName(roleName).Id;
    var appUserRole = new ApplicationUserRole {
         UserId = user.Id,
         RoleId = roleId,
         CustomField1 = "value1",
         CustomField2 = "value2",
         ....
    };
    user.Roles.Add(appUserRole);
}

相关内容

  • 没有找到相关文章

最新更新