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; }
}
答案 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所示。