如何重写UserManager的基本功能.GetRolesAsync (TKey userId)
本文关键字:功能 TKey userId GetRolesAsync UserManager 何重写 重写 | 更新日期: 2023-09-27 18:03:10
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; }
}
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内置了依赖注入系统,如下所示。