Эмитент и потребитель токена IdentityServer4 в одном проекте

У меня есть проект, в котором размещается IdentityServer4, и я пытаюсь также разместить в этом же проекте Web API, который принимает токен доступа.

Мой вопрос: возможно ли, чтобы один проект содержал IdentityServer и веб-API, которые используют один и тот же IdentityServer?

РЕДАКТИРОВАТЬ: API должен быть защищен с атрибутом Authorize

2 ответа

Решение

У меня есть проект сервера удостоверений 4, в этом же проекте есть API для CIUD клиентов. (Давайте назовем это API консоли разработчика).

Затем у меня есть побочный проект с базовым проектом asp.net, который содержит реальные страницы бритвы для консоли разработчика, к которой он обращается к API в проекте сервера Identity.

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

Да, вы можете иметь веб-API из вашего проекта Identity Server 4.

Настроить сервис

services.AddAuthentication(IdentityServerConstants.DefaultCookieAuthenticationScheme)
                .AddIdentityServerAuthentication(options =>
                {
                    // base-address of your identityserver
                    options.Authority = settingsSetup.Settings.Authority;
                    // name of the API resource
                    options.ApiName = "testapi";
                    options.RequireHttpsMetadata = false;
                });

конфигурировать

Я думаю, что нужно иметь оба из них.

JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
app.UseAuthentication();
app.UseIdentityServer();

Endpoints

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

[HttpGet("Client/List")]
[Authorize(AuthenticationSchemes = "Bearer")]
public ActionResult ClientList()
  {

  }

Хотя ответ @DaImTo правильный и работает, и он разработан командой IdentityServer, он использует Introspection Endpoint что означает для каждого запроса AddIdentityServerAuthentication создаст запрос http и отправит его на ваш сервер, который является тем же приложением.

Я разработал библиотеку под названием IdentityServer4.Contrib.LocalAccessTokenValidation, которая делает то же самое, но без использования Introspection Endpoint, Это будет аутентифицировать токен непосредственно из TokenStore который настроен в Сервисах. Вы можете использовать его, если вы заинтересованы.

ссылка Nuget: https://www.nuget.org/packages/IdentityServer4.Contrib.LocalAccessTokenValidation

ссылка на github: https://github.com/Kahbazi/IdentityServer4.Contrib.LocalAccessTokenValidation

Другие вопросы по тегам