Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

MVC 5 : Asp.net Identity : How to model UserRole

I am new to MVC 5 asp.net Identity model and was looking for means to customise standard Asp.net Identity to suit my needs. Through blog on TypeCast Exception and one at Stackoverflow: How to model Identity I was able to create my own elements in ApplicationUser and ApplicationRole tables. However, my requirement is to add new columns to UserRole table, DATE_FROM and DATE_TO which I did by implementing IdentityUserRole interface. My problem is when I'm trying to save the link UserManager.AddRoleToUser takes only two parameters, UserName and RoleName. How to store parameters for custom 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;
            }

the SelectUserRolesViewModel supplies extended IdnetityUserRole model. Any pointer will be appreciated.

like image 322
siddhant Kumar Avatar asked Oct 20 '22 14:10

siddhant Kumar


1 Answers

If you add additional properties to the ApplicationUserRole table, you can't use AddUserToRole method anymore. Because AddUserToRole method is from UserManagerExtensions class which is sealed class, you cann't create your own class to inherit from UserManagerExtensions. I'm not sure there are any better solution for this, but below is a working example.

Add additional properties to the ApplicationUserRole table:

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

Then you can create a new ApplicationUserRole instance like below:

    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();
   }
like image 144
Lin Avatar answered Nov 02 '22 22:11

Lin