什么是 ProfileService/When 执行的是 ProfileService?

What is a ProfileService/When is a ProfileService executed?

我一直在玩 IdentityServer4。绝对喜欢它。

我一直在浏览您网站上的教程,特别是 https://identityserver4.readthedocs.io/en/release/quickstarts/7_javascript_client.html

我创建了一个执行以下操作的配置文件服务:

public class ProfileService : IProfileService
{
    public Task GetProfileDataAsync(ProfileDataRequestContext context)
    {
        context.IssuedClaims.Add(new Claim("test-claim", "test-value"));
        return Task.FromResult(0);
    }

    public Task IsActiveAsync(IsActiveContext context)
    {
        context.IsActive = true;

        return Task.FromResult(0);
    }
}

效果很好,我的自定义声明在我的 JS 客户端的日志 window 中可见。

我在它上面放了一个断点只是为了检查上下文中的内容,我注意到它被击中了两次。调用者属性分别为 ClaimsProviderAccessTokenUserInfoEndpoint。这是为什么?

我天真地从我的 js 客户端中删除了 profile 范围,并且在 oidc-js 配置中也删除了配置文件范围,并设置 loadUserInfo: false 但我的 ProfileService 它是还是叫了两次。

如果我的最终目标是根据数据库中的参数设置声明,我真的不想重复执行此操作,对吗? (真正的问题——我不知道)。 'solution' 将只在 "ClaimsProviderAccessToken" 上设置它们,但有一些事情告诉我 ProfileServices 被调用两次是有原因的,并且它在两次运行中设置声明有一定的重要性。

每当 IdentityServer 需要 return 向客户端应用程序声明用户时,就会调用配置文件服务。

如果您请求身份和访问令牌 - 它将被调用两次(因为您可能对每种令牌类型提出不同的声明)。