因此,我的系统要求角色具有相关的到期日期。我已经实现了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吗?这似乎有点矫枉过正。
我能够通过在帐户创建时不允许角色/到期选择以及将其留在编辑模式来解决问题。但我真的希望能够同时创建帐户并分配角色/到期日。
答案 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);
}