Как включить претензии только в id_token, но не в access_token IdentityServer4 - PullRequest
0 голосов
/ 04 марта 2020

я использую Identity Server 4 и тип неявного предоставления. У меня есть SPA, который делает запрос на авторизацию для IS4 с response_type: 'id_token token'. У меня есть простая реализация IProfileService с методом GetProfileDataAsyn c:

public virtual Task GetProfileDataAsync(ProfileDataRequestContext context)
        {
            context.AddRequestedClaims(context.Subject.Claims);

            context.IssuedClaims.Add(new Claim("custom1", "custom1"));

            context.IssuedClaims.Add(new Claim("custom2", "custom2"));

            return Task.CompletedTask;
        }

И все нормально, я получаю access_token и id_token. Но они оба содержат мои собственные претензии. Как включить в access_token только претензию "custom1", а в id_token - претензии "custom1" и "custom2"?

Ответы [ 2 ]

1 голос
/ 04 марта 2020

Служба профилей вызывается несколько раз в другом контексте:

  • Для токена доступа : Context.Caller = ClaimsProviderAccessToken
  • Для идентификатора токен : Context.Caller = UserInfoEndpoint

Для утверждений контекста c утверждений необходимо проверить вызывающего контекст:

public async Task GetProfileDataAsync(ProfileDataRequestContext context)
{
    context.AddRequestedClaims(context.Subject.Claims);

    context.IssuedClaims.Add(new Claim("custom1", "custom1"));

    // Add access token claims
    if (Context.Caller == "ClaimsProviderAccessToken")
    {
    }

    // Add identity token claims
    if (Context.Caller == "UserInfoEndpoint")
    {
        context.IssuedClaims.Add(new Claim("custom2", "custom2"));
    }
    return Task.CompletedTask;
}
0 голосов
/ 05 марта 2020

Хорошо, благодаря Руарду ван Элбергу, я смог это сделать. Правильный ответ:

  • Для токена доступа: Context.Caller = ClaimsProviderAccessToken
  • Для токена идентификации: Context.Caller = ClaimsProviderIdentityToken
  • Для конечной точки пользовательской информации: Context .Caller = UserInfoEndpoint

И код:

public Task GetProfileDataAsync(ProfileDataRequestContext context)
    {
        context.AddRequestedClaims(context.Subject.Claims);

        // Add claims to access token
        if (context.Caller == "ClaimsProviderAccessToken")
        {
            context.IssuedClaims.Add(new Claim("custom1", "custom1"));
        }

        // Add identity token claims
        if (context.Caller == "ClaimsProviderIdentityToken")
        {
            context.IssuedClaims.Add(new Claim("custom1", "custom1"));

            context.IssuedClaims.Add(new Claim("custom2", "custom2"));
        }

        // Add userinfo endpoint claims
        if (context.Caller == "UserInfoEndpoint")
        {
            context.IssuedClaims.Add(new Claim("custom1", "custom1"));

            context.IssuedClaims.Add(new Claim("custom2", "custom2"));
        }

        return Task.CompletedTask;
    }
...