9

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

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

我创建了一个 Profile Service,它执行以下操作:

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 客户端的日志窗口中可见。

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

在我的天真中,我profile从我的 js 客户端中删除了范围,并且在 oidc-js 配置中也删除了配置文件范围,并设置loadUserInfo: false了我的ProfileService它仍然被调用了两次。

如果我的最终目标是根据数据库中的参数设置声明,我真的不想做这个操作两次,是吗?(真正的问题——我不知道)。一个“解决方案”是只将它们设置在“ClaimsProviderAccessToken”上,但是有一些东西告诉我,ProfileServices 会被调用两次是有原因的,并且在两次运行中设置声明有一定的重要性。

4

1 回答 1

17

每当 IdentityServer 需要将有关用户的声明返回给客户端应用程序时,都会调用配置文件服务。

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

于 2017-02-06T13:25:56.133 回答