【问题标题】:Lazy Loading issue while overriding UserClaimsPrincipalFactory in IdentityServer4在 IdentityServer4 中覆盖 UserClaimsPrincipalFactory 时出现延迟加载问题
【发布时间】:2019-12-02 01:52:58
【问题描述】:

在尝试将 ApplicationUser 属性添加为身份声明时,我有一个空声明。 看起来 ef 在延迟加载以下两个属性时遇到了问题。

public class ApplicationUser : IdentityUser
{
    public virtual ApplicationUser Manager { get; set; }
    public virtual List<ApplicationUser> ManagerOf { get; set; }
}

我知道我正在输入这段代码。 但是在 GenerateClaimsAsync 中,用户的属性设置为 null(只有上面两个)。我检查了数据库,我有明确定义的值。

public class MyUserClaimsPrincipalFactory : UserClaimsPrincipalFactory<ApplicationUser>
{
    public MyUserClaimsPrincipalFactory(
        UserManager<ApplicationUser> userManager,
        IOptions<IdentityOptions> optionsAccessor)
        : base(userManager, optionsAccessor)
    {
    }

    protected override async Task<ClaimsIdentity> GenerateClaimsAsync(ApplicationUser user)
    {
        var identity = await base.GenerateClaimsAsync(user);
        var managerId = "";
        if (user.Manager?.Id != null)
        {
            managerId = user.Manager.Id;
        }
        identity.AddClaim(new Claim("manager_id", managerId));
        var managerOf = "";
        if (user.ManagerOf != null)
        {
            managerOf = string.Join(", ", user.ManagerOf.Select(u => u.Id).ToArray());     
        }

        identity.AddClaim(new Claim("manager_of", managerOf));
        return identity;
    }
}

你们有什么想法吗?

谢谢!

【问题讨论】:

  • 我想第一个问题是——你有没有明确地在 DbContext 上启用延迟加载?如果为 EF 启用调试日志记录,在单步执行该代码时是否会看到任何日志或调试消息?
  • 任何lazy属性都必须在DbContext的范围内访问,即使是创建不同类型的DTO
  • @mackie 不,我认为这是 dotnet 核心中的默认行为。我试试看
  • @usr-local-ΕΨΗΕΛΩΝ dbcontext 的“范围”是什么意思?我们谈论的是哪个范围?
  • @usr-local-ΕΨΗΕΛΩΝ 在 Web 应用程序中,DbContext 通常会限定为请求范围,因此虽然我不是延迟加载的忠实粉丝,但假设 DbContext 是“活动的”很好在这种情况下。

标签: c# asp.net-core entity-framework-core asp.net-identity


【解决方案1】:

正如@mackie 指出的,默认情况下不启用延迟加载。 我只需要按照本教程启用延迟加载:https://www.learnentityframeworkcore.com/lazy-loading

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-14
    • 1970-01-01
    • 1970-01-01
    • 2018-01-24
    • 2014-04-08
    • 2021-04-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多