Получение имени клиента в IdentityServer4 и ASP.NET Core

Таблица dbo.Clients в базе данных IdentityServer содержит как ClientId, так и ClientName, однако запрос токена учетных данных клиента не включает имя клиента в токен.

Есть ли способ получить информацию о клиенте из IdentityServer по идентификатору клиента или запросить добавление имени клиента в токен?


person nullPainter    schedule 15.10.2019    source источник


Ответы (2)


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

public class ClaimClientsUpdated : ICustomTokenRequestValidator
{
    public Task ValidateAsync(CustomTokenRequestValidationContext context)
    {
        context.Result.ValidatedRequest.Client.AlwaysSendClientClaims = true;
        context.Result.ValidatedRequest.ClientClaims.Add(new Claim("name", context.Result.ValidatedRequest.Client.ClientName));

       return Task.FromResult(0);
    }
}

Зарегистрируйтесь в DI:

services.AddTransient<ICustomTokenRequestValidator, ClaimClientsUpdated>();

Он добавит префикс client_ к настраиваемым утверждениям, поэтому в токене доступа будет "client_name": "value".

person Nan Yu    schedule 15.10.2019

Вы можете добавить информацию о клиенте в целом, добавив утверждения в таблицу ClientClaims. Например. Type = Name, Value = MyCustomName

Что добавлено как утверждение (при условии префикса client_):

"client_Name": "MyCustomName"

Это позволит вам добавлять информацию о клиенте без добавления или изменения кода.

Недостатком имени клиента является то, что вам придется добавить утверждение с избыточной информацией, поскольку Clients.ClientName не является источником. Преимущество в том, что это только конфигурация.

person Ruard van Elburg    schedule 15.10.2019
comment
Спасибо! Это мощный универсальный подход, но я думаю, что прибегаю к валидатору @ nan-yu, просто чтобы избежать двух источников истины. - person nullPainter; 15.10.2019
comment
@nullPainter Ничего страшного. Я просто хотел упомянуть эту альтернативу, чтобы вы знали о ней. С другой стороны, вам нужно будет установить его только один раз. Маловероятно, что значение когда-либо изменится, поскольку оно используется в качестве ключа. - person Ruard van Elburg; 15.10.2019