如何覆盖 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。
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。