我是MVC 5 asp.net身份模型的新手,正在寻找自定义标准
Asp.net身份的方法以满足我的需求.通过
TypeCast Exception上的博客和
Stackoverflow: How to model Identity上的一个,我能够在ApplicationUser和ApplicationRole表中创建自己的元素.但是,我的要求是通过实现IdentityUserRole接口向UserRole表,DATE_FROM和DATE_TO添加新列.我的问题是当我试图保存链接UserManager.AddRoleToUser只接受两个参数,UserName和RoleName.如何存储自定义ApplicationUserRole的参数?
public bool AddUserToRole(string userId,SelectUserRolesViewModel roleName) { var um = new UserManager<ApplicationUser>( new UserStore<ApplicationUser>(new ApplicationDbContext())); var idResult = um.AddToRole(userId,roleName); return idResult.Succeeded; }
SelectUserRolesViewModel提供扩展的IdnetityUserRole模型.任何指针将不胜感激.
解决方法
如果向ApplicationUserRole表添加其他属性,则不能再使用AddUserToRole方法.因为AddUserToRole方法来自UserManagerExtensions类,它是密封类,所以不能创建自己的类来继承UserManagerExtensions.我不确定是否有更好的解决方案,但下面是一个有效的例子.
向ApplicationUserRole表添加其他属性:
public class ApplicationUserRole : IdentityUserRole { public DateTime DateFrom { get; set; } public DateTime DateTo { get; set; } } public class ApplicationDbContext : IdentityDbContext<ApplicationUser> { public ApplicationDbContext() : base("DefaultConnection") { } public DbSet<ApplicationUserRole> ApplicationUserRoles { get; set; } }
然后,您可以创建一个新的ApplicationUserRole实例,如下所示:
using (var _db = new ApplicationDbContext()) { var roleName = //Get role name from somewhere here var roleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(_db)); if (!roleManager.RoleExists(roleName)) { var newRoleresult = roleManager.Create(new IdentityRole() { Name = roleName,}); } var userRole = new ApplicationUserRole { UserId = currentUser.Id,RoleId = roleManager.FindByName(roleName).Id,DateFrom = DateTime.Now,DateTo = DateTime.Now.AddDays(1) }; _db.ApplicationUserRoles.Add(userRole); _db.SaveChanges(); }