Как переопределить базовую функциональность 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 или даже предоставить новый метод, такой как GetModelRolesAsync(строка 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 ответ

Решение

Библиотека Asp.Net Identity Entity Framework предоставляет Ролевую модель идентификации из коробки, которая называется IdentityRole, Вы можете использовать это в сочетании с предоставленным RoleManager Класс, чтобы вернуть 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, как показано здесь.

Другие вопросы по тегам