如何覆盖 UserManager.GetRolesAsync(TKey userId) 的基本功能

How to Override base functionality of UserManager.GetRolesAsync(TKey userId)

GetRolesAsync(TKey userId) 的基本功能如下

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

有谁知道如何在 UserManager 的派生 class 中覆盖此功能,或者甚至向 return roleModel 提供像 GetModelRolesAsync(string userId) 这样的新方法。

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

Asp.Net Identity Entity Framework 库为 return IdentityRole 模型提供了一个开箱即用的名为 IdentityRole. You can use this in combination with the provided RoleManager Class 的身份角色模型。

不过您必须提供自己的函数,Task<IList<string>> GetRolesAsync(TKey userId) 的接口在基础 class 中设置为 return 仅字符串。

这是一个例子:

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

您可以将系统配置为使用 ASP.NET 的 RoleManager 内置依赖注入系统,如图 here