对于_userManager.GetRolesAsync(user),它调用userRoleStore.GetRolesAsync
public virtual async Task<IList<string>> GetRolesAsync(TUser user)
{
ThrowIfDisposed();
var userRoleStore = GetUserRoleStore();
if (user == null)
{
throw new ArgumentNullException(nameof(user));
}
return await userRoleStore.GetRolesAsync(user, CancellationToken);
}
对于返回角色 id 而不是角色名称,您可以userRoleStore.GetRolesAsync通过实现自己的UserStore.
用户存储.cs
public class CustomUserStore : UserStore<IdentityUser>
{
public CustomUserStore(DbContext context, IdentityErrorDescriber describer = null) : base(context, describer)
{
}
public override async Task<IList<string>> GetRolesAsync(IdentityUser user, CancellationToken cancellationToken = default(CancellationToken))
{
var roleNames = await base.GetRolesAsync(user, cancellationToken);
var roleIds = await Context.Set<IdentityRole>()
.Where(r => roleNames.Contains(r.Name))
.Select(r => r.Id)
.ToListAsync();
return roleIds;
}
}
注册用户存储
services.AddDefaultIdentity<IdentityUser>()
.AddRoles<IdentityRole>()
.AddUserStore<CustomUserStore>()
.AddEntityFrameworkStores<ApplicationDbContext>()
;
services.AddScoped<DbContext, ApplicationDbContext>();
然后您将通过以下方式获取角色 ID 集合
var user = await _userManager.FindByNameAsync(User.Identity.Name);
var roles = await _userManager.GetRolesAsync(user);