首页 > 解决方案 > 在 IdentityServer4 中覆盖 UserClaimsPrincipalFactory 时出现延迟加载问题

问题描述

尝试将 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;
    }
}

你们有什么想法吗?

谢谢 !

标签: c#asp.net-coreentity-framework-coreasp.net-identity

解决方案


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


推荐阅读