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

Я использую Identity Server 4, и я пытаюсь использовать конечную точку интроспекции, но только по документам я не получаю ее.

Документы просто приводят этот пример

POST /connect/introspect
Authorization: Basic xxxyyy

token=<token>

Теперь, почему существует эта базовая аутентификация и что должно быть xxxyyy? Я имею в виду, что в моем приложении нет базового auth. Я только что установил Identity Server 4 с использованием ядра ASP.NET следующим образом в ConfigureServices:

services.AddIdentityServer()
            .AddTemporarySigningCredential()
            .AddInMemoryApiResources(ApiResourceProvider.GetAllResources())
            .AddAspNetIdentity<Usuario>();

и в Configure

app.UseIdentity();
app.UseIdentityServer();

Теперь я пробовал просто POST для /connect/introspect с телом только token=<token>, но он вернул 404.

Я считаю, что я действительно этого не понимал.

Как мы используем конечную точку интроспекции с Identity Server 4 в ядре ASP.NET?

Ответ 1

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

Итак, то, что вы должны передать POST/connect/introspect является секретом области.

Вы можете настроить быстрый запуск, изменив класс config.cs. Вам нужно будет обновить хранилище данных, которое вы используете, если вы настроили его или не используете быстрый запуск - но концепция должна (надеюсь) быть ясной.

public static IEnumerable<ApiResource> GetApiResources()
    {
        return new List<ApiResource>
        {
            new ApiResource("MyResource", "My_Resource_DisplayName")
            {
                ApiSecrets = new List<Secret>
                {
                    new Secret("hello".Sha256())
                },
                Scopes=
                {
                    new Scope("MY_CUSTOM_SCOPE")
                }
            }
        };
    }

Сейчас...
1. Убедитесь, что ваш клиент имеет область действия MY_CUSTOM_SCOPE
2. Убедитесь, что вы запросили область действия MY_CUSTOM_SCOPE при получении токена на предъявителя.

Теперь создайте в кодировке Base64 строку с именем ресурса api и секретом, например так:

Convert.ToBase64String(Encoding.UTF8.GetBytes(string.Format("{0}:{1}", userName, password)));

Там, где имя пользователя - MyResource а пароль - в виде открытого текста (hello используйте ваши собственные значения!) - в итоге должна TXlSZXNvdXJjZTpoZWxsbw== строка, которая выглядит следующим образом: TXlSZXNvdXJjZTpoZWxsbw==

Теперь вы можете отправлять сообщения в IDSvr4...

POST /connect/introspect
Authorization: Basic TXlSZXNvdXJjZTpoZWxsbw==
Accept: application/json
Content-Type: application/x-www-form-urlencoded

token=<YOUR_TOKEN>

Итак, если ваш токен на предъявителя имеет область действия MY_CUSTOM_SCOPE (или как вы там его называли), теперь вы сможете использовать конечную точку самоанализа IdSvr для получения информации об этом.

Надеюсь, это поможет!

Ответ 2

Интроспекция обычно используется API для проверки входящего токена. Кроме того, конечная точка интроспекции требует проверки подлинности по спецификации.

Вам нужно настроить секрет API:

https://identityserver4.readthedocs.io/en/release/reference/api_resource.html

И затем используйте имя/секретное имя api для аутентификации против конечной точки интроспекции. Либо используя обычную проверку подлинности, либо отправляя значения в форме.