在Identity 2.0中扩展IdentityUserRole

时间:2014-09-15 22:22:36

标签: c# asp.net-mvc entity-framework asp.net-identity

因此,我的系统要求角色具有相关的到期日期。我已经实现了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表,以便添加第三列,即DateTime,称为Expiry。我可以使用ApplicationDBContext添加,更新和删除到期日,在编辑用户时一切正常。

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

我需要实现自己的UserManager吗?这似乎有点矫枉过正。

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

2 个答案:

答案 0 :(得分:2)

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

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

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

您不需要实现自己的userManager,但必须对其进行修改。希望您可以使用此示例来满足您的需求。

答案 1 :(得分:1)

我知道这已经得到了解答 - 但是如果有人对此感兴趣 - 但是我没有使用UserManager.AddToRolesAsync,而是循环使用新角色并使用 Role.Add()方法< strong>用户;像这样:

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