Как получить роль пользователя при запросе на получение от всех пользователей? - PullRequest
0 голосов
/ 04 ноября 2019

Я использую Asp Net Core 3.0, с удостоверением личности и JWT. Я могу получить всех пользователей без проблем, но роль всегда будет нулевой или просто нулевой.

      [Route("ListUsers")]
      [AllowAnonymous]
      public IActionResult ListUsers()
      {
          var users = userManager.Users;          
          return Ok(users);
      }

1 Ответ

0 голосов
/ 05 ноября 2019

Вы можете зациклить всех пользователей и получить роли каждого пользователя с помощью:

foreach (var user in _userManager.Users.ToList())
{
    var roles = await _userManager.GetRolesAsync(user);
}

Другое решение заключается в создании связи между многими пользователями и ролями, так что вы можете include с помощью запроса EFчтобы получить роли. Основываясь на это решение , приведенный ниже пример кода работает в asp.net core 3.0 с идентификатором:

ApplicationUser:

foreach (var user in _userManager.Users.ToList())
{
    var roles = await _userManager.GetRolesAsync(user);
}

ApplicationRole:

public class ApplicationRole : IdentityRole
{
    public ICollection<ApplicationUserRole> UserRoles { get; set; }
}

ApplicationUserRole:

public class ApplicationUserRole : IdentityUserRole<string>
{
    public virtual ApplicationUser User { get; set; }
    public virtual ApplicationRole Role { get; set; }
}

ApplicationDbContext:

public class ApplicationDbContext
 : IdentityDbContext<ApplicationUser, ApplicationRole, string, IdentityUserClaim<string>,
 ApplicationUserRole, IdentityUserLogin<string>,
 IdentityRoleClaim<string>, IdentityUserToken<string>>
{
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
        : base(options)
    {
    }
    protected override void OnModelCreating(ModelBuilder builder)
    {
        base.OnModelCreating(builder);

        builder.Entity<ApplicationUserRole>(userRole =>
        {
            userRole.HasKey(ur => new { ur.UserId, ur.RoleId });

            userRole.HasOne(ur => ur.Role)
                .WithMany(r => r.UserRoles)
                .HasForeignKey(ur => ur.RoleId)
                .IsRequired();

            userRole.HasOne(ur => ur.User)
                .WithMany(r => r.UserRoles)
                .HasForeignKey(ur => ur.UserId)
                .IsRequired();
        });
    }
}

Запуск:

services.AddDefaultIdentity<ApplicationUser>(options => options.SignIn.RequireConfirmedAccount = true).AddRoles<ApplicationRole>()
    .AddEntityFrameworkStores<ApplicationDbContext>();

И получение пользователей и ролей (UserManager<ApplicationUser>):

 var Users = _userManager.Users.Include(u => u.UserRoles).ThenInclude(ur => ur.Role).ToList();

Не забудьте изменить на UserManager<ApplicationUser>/SignInManager<ApplicationUser> в _LoginPartial.cshtml.

...