1

The base functionality for GetRolesAsync(TKey userId) is the following

        public virtual async Task<IList<string>> GetRolesAsync(TKey userId)
    {
        ThrowIfDisposed();
        var userRoleStore = GetUserRoleStore();
        var user = await FindByIdAsync(userId).WithCurrentCulture();
        if (user == null)
        {
            throw new InvalidOperationException(String.Format(CultureInfo.CurrentCulture, Resources.UserIdNotFound,
                userId));
        }
        return await userRoleStore.GetRolesAsync(user).WithCurrentCulture();
    }

Does anyone know how to override this functionality in a derived class of UserManager or even provide a new Method like GetModelRolesAsync(string userId) to return a roleModel.

public class ApplicationUserManager : UserManager<ApplicationUser>
{
    public ApplicationUserManager(IUserStore<ApplicationUser> store)
        : base(store)
    {
    }

    public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context)
    {
        var manager = new ApplicationUserManager(new UserStore<ApplicationUser>(context.Get<ApplicationDbContext>()));
        // Configure validation logic for usernames
        manager.UserValidator = new UserValidator<ApplicationUser>(manager)
        {
            AllowOnlyAlphanumericUserNames = false,
            RequireUniqueEmail = true
        };
        // Configure validation logic for passwords
        manager.PasswordValidator = new PasswordValidator
        {
            RequiredLength = 6,
            RequireNonLetterOrDigit = true,
            RequireDigit = true,
            RequireLowercase = true,
            RequireUppercase = true,
        };
        var dataProtectionProvider = options.DataProtectionProvider;
        if (dataProtectionProvider != null)
        {
            manager.UserTokenProvider = new DataProtectorTokenProvider<ApplicationUser>(dataProtectionProvider.Create("ASP.NET Identity"));
        }
        return manager;
    }

    public override async Task<IList<RoleModel>> GetRolesAsync(string userId)
    {
        // Need code here to return a RoleModel that includes the ID
        // as well as the role name, so a complex object instead of just
        // a list of strings


    }
}


public class RoleModel
{
    public string Id { get; set; }
    public string Name { get; set; }
}
DRobertE
  • 3,478
  • 3
  • 26
  • 43

1 Answers1

3

Asp.Net Identity Entity Framework library provides an Identity Role Model out of the box called IdentityRole. You can use this in combination with the provided RoleManager Class to return the IdentityRole model.

You will have to provide your own function though, the interface for Task<IList<string>> GetRolesAsync(TKey userId) is set in the base class to return only strings.

Here is an example:

public class ApplicationUserManager : UserManager<ApplicationUser>
{
    private RoleManager<IdentityRole> _roleManager;

    public ApplicationUserManager(IUserStore<ApplicationUser> store)
        : base(store)
    {
        _roleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>());
    }

    public async Task<IList<IdentityRole>> GetModelRolesAsync(string userId)
    {
        IList<string> roleNames = await base.GetRolesAsync(userId);

        var identityRoles = new List<IdentityRole>();
        foreach (var roleName in roleNames)
        {
            IdentityRole role = await _roleManager.FindByNameAsync(roleName);
            identityRoles.Add(role);
        }

        return identityRoles; 
     }      
}

You can configure the system to use ASP.NET's built in dependency injection system for the RoleManager as shown here.

jsturtevant
  • 2,560
  • 1
  • 23
  • 23