当前位置: 首页 > 面试题库 >

.NET Core 2.1身份使所有用户具有其关联的角色

隆飞宇
2023-03-14
问题内容

我正在尝试为用户管理管理员页面提取所有我的Identity用户及其相关角色。我认为这将相当容易,但显然并非如此。我已经尝试按照以下解决方案进行操作:https
:
//stackoverflow.com/a/43562544/5392786,但到目前为止尚未解决。

这是我到目前为止的内容:

应用用户:

public class ApplicationUser : IdentityUser
{
    public List<IdentityUserRole<string>> Roles { get; set; }
}

数据库上下文

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
        : base(options)
    {
    }
}

启动身份码

services.AddIdentity<ApplicationUser, IdentityRole>(options => options.Stores.MaxLengthForKeys = 128)
            .AddEntityFrameworkStores<ApplicationDbContext>()
            .AddDefaultTokenProviders();

我要在其中显示列表的剃须刀页面:

public class IndexModel : PageModel
{
    private readonly UserManager<ApplicationUser> userManager;

    public IndexModel(UserManager<ApplicationUser> userManager)
    {
        this.userManager = userManager;
    }

    public IEnumerable<ApplicationUser> Users { get; set; }

    public void OnGetAsync()
    {
        this.Users = userManager.Users.Include(u => u.Roles).ToList();
    }
}

致电时出现以下错误userManager.Users.Include(u => u.Roles).ToList();

MySql.Data.MySqlClient.MySqlException:’字段列表中的未知列’u.Roles.ApplicationUserId’‘’


问题答案:

我现在已经实现了以下解决方案。

正如CodeNotFound在注释中指出的那样,IdentityUser曾经具有一个Roles属性。.NET
Core中不再是这种情况。GitHub上的此注释/问题似乎是.Net
Core的当前解决方案。我试图用以下代码实现它:

应用用户

public class ApplicationUser : IdentityUser
{
    public ICollection<ApplicationUserRole> UserRoles { get; set; }
}

ApplicationUserRole

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

应用角色

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

数据库上下文

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.AddIdentity<ApplicationUser, ApplicationRole>(options => options.Stores.MaxLengthForKeys = 128)
            .AddEntityFrameworkStores<ApplicationDbContext>()
            .AddDefaultTokenProviders();

最后,请确保在使用它时先加载用户的UserRoles,然后再加载UserRole的Role,如下所示:

this.Users = userManager.Users.Include(u => u.UserRoles).ThenInclude(ur => ur.Role).ToList();

我有一个问题,其中Role每个属性UserRole均为null,并通过添加.ThenInclude(ur => ur.Role)零件来解决。

关于多级紧急加载的Microsoft文档:https :
//docs.microsoft.com/zh-cn/ef/core/querying/related-data#includes-multiple-
levels

ASP Core 2.2更新

IdentityUserRole<Guid>不是字符串的固有特性您可能还需要删除ModelBuilder中的代码才能使迁移正常进行。



 类似资料:
  • 我与拉雷维尔和托拉斯合作,基础工作很好。我确实有一个问题似乎不是随包而来的。我想要的是,当我执行时,如果他们登录,它也会返回他们的角色。目前我知道我可以做

  • 我在一个有这种结构的拉威尔项目中工作 用户:id | first | u name |。。。 角色:id|name 分配的角色:id |用户id |角色id 我认为这是很明显的:p 用户模型 角色模型 我正在寻找一种方法来获取所有具有指定角色(在本例中为“教师”)的用户。我试过这个: 但这总是返回一个包含所有用户的数组。 有人知道为什么会这样吗?谢谢

  • 我是AWS的新手,正在学习Cognito池。 我计划使用与Cognito联合身份池连接的Cognito用户池。我不想使用带有托管用户界面功能的登录或任何其他登录用户界面登录。 以下情况是否属实/可能:- 从后端使用用户名和密码调用一些Cognoto API时,它可以自动调用配置的用户池联合身份提供程序来验证用户,然后生成JWT令牌。如果是,请您为我指点/指导。 我真的很感激任何帮助。提前谢谢。

  • 我搜索了以下内容:,但没有找到任何内容。 JDA版本:

  • 我有以下问题。当使用下面的代码来更改用户的当前角色时,我收到了如下消息的异常: 附加“模型。实体。用户”类型的实体失败,因为另一个相同类型的实体已经具有相同的主键值。如果图形中的任何实体具有冲突的键值,则使用“附加”方法或将实体的状态设置为“未更改”或“修改”时可能会发生这种情况。这可能是因为某些实体是新的并且尚未收到数据库生成的键值。在这种情况下,使用“添加”方法或“添加”实体状态来跟踪图形,然

  • 问题内容: 我有一台服务器,使用Java应用程序处理数据库和文件。当我启动我的应用程序时,我使用以下命令提供有关文件访问服务器的报告: 每次启动我的应用程序(重新启动计算机后),即使服务器已打开,我也会得到错误的响应。原因是因为我必须提供另一个用户的身份验证。我要做的是通过要求我输入用户名/密码的Windows访问服务器,然后我得到了有关对服务器文件访问的真实响应。 有没有办法 通过Java 而不