因此,我的系统要求角色具有相关的到期日期。我已经实现了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,而是循环使用新角色,并使用User的Role.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);
}