IdentityServer4 — мне нужно утверждение given_name в моем коде API, но в моем API нет токена идентификации. Как я могу получить given_name?

#identityserver4 #access-token #claims-based-identity

#identityserver4 #токен доступа #идентификатор на основе утверждений

Вопрос:

У меня есть мобильный клиент (Android), API (WebAPI .net Core 3.1) и IdentityServer4.

Я захожу с моим клиентом на IdentityServer и получаю обратно токен идентификации и токен доступа.

Я использую токен access для доступа к API … пока все хорошо.

Теперь в API, только в первый раз, мне нужно обновить таблицу с именем и фамилией пользователя плюс некоторые другие идентификационные данные, но эти утверждения недоступны в API (поскольку эта информация недоступна в токене доступа)

Мой вопрос в том, как мне получить утверждения пользователя из моего кода API?

Я мог бы передавать различные утверждения в виде строковых параметров в вызов API, но мобильный клиент не может увидеть, произошло ли это обновление, поэтому мне пришлось бы передавать эту информацию каждый раз, когда я вызываю API, что очень расточительно, поскольку требуется только в первый раз. Я также предпочитаю, чтобы это было сделано без раскрытия этого в конечной точке моего API.

Кто-нибудь может подсказать, как я могу получить утверждения пользователя (профиля) с помощью API?

Обновление: теперь я нашел конечную точку в IdentityServer, которая могла бы помочь, называется «userinfo_endpoint», но для этого нужен токен доступа. Могу ли я каким-либо образом повторно использовать токен доступа, который используется для доступа к API в моем коде API?

Ответ №1:

Да, вы можете использовать тот же токен доступа для связи с конечной точкой user info, чтобы получить дополнительную информацию о пользователе.

Если бы вы использовали JavaScript для доступа к нему, это могло бы выглядеть следующим образом:

         //Make a AJAX-call to the user endpoint
        $.ajax({
            url: "@OpenIDSettings.userinfo_endpoint",
            type: 'GET',
            headers: { "Authorization": 'Bearer '   params.access_token }
        }).done(function (data) {

            $("#userinfo").text(JSON.stringify(data, null, 2));
        });
  

Вы просто устанавливаете заголовок авторизации.

Вы также можете добавить пользовательские утверждения к токену доступа, указав UserClaims в своих ApiScopes или определениях ApiResource, например:

 new ApiScope()
{
    Name = "shop.admin",
    DisplayName = "You can administrate the e-shop systems",
    Description = "Full admin access to the e-shop system.",
    Emphasize = false,
    Enabled = true,
    Required = false,
    UserClaims = new List<string>
    {
        //Custom user claims that should be provided when requesting access to this API.
        //These claims will be added to the access token, not the ID-token!
        "seniority",
    }
}
  

Комментарии:

1. Большое вам за это спасибо! Я добавлю утверждения в ApiScope, как вы предложили 🙂