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

时间:2015-07-17 14:53:03

标签: c# asp.net user-roles asp.net-roles security-roles

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的派生类中覆盖此功能,甚至提供一个新的方法,如GetModelRolesAsync(string userId)来返回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; }
}

1 个答案:

答案 0 :(得分:2)

Asp.Net Identity Entity Framework库提供了一个名为IdentityRole的开箱即用的身份角色模型。您可以将其与提供的RoleManager Class结合使用,以返回IdentityRole模型。

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

以下是一个例子:

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所示。