在 IdentityServer4 中覆盖 UserClaimsPrincipalFactory 时出现延迟加载问题
Lazy Loading issue while overriding UserClaimsPrincipalFactory in IdentityServer4
我在尝试添加 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;
}
}
你们有想法吗?
谢谢!
正如@mackie 所指出的,默认情况下不启用延迟加载。
我只需要按照本教程启用延迟加载:https://www.learnentityframeworkcore.com/lazy-loading.
我在尝试添加 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;
}
}
你们有想法吗?
谢谢!
正如@mackie 所指出的,默认情况下不启用延迟加载。 我只需要按照本教程启用延迟加载:https://www.learnentityframeworkcore.com/lazy-loading.