Учетные данные клиента Identity Server 4 для настраиваемой конечной точки на сервере токенов - PullRequest
0 голосов
/ 22 октября 2018

Я реализовал токен-сервер, используя Identity Server 4.

Я добавил пользовательскую конечную точку API на токен-сервер и борюсь с аутентификацией.Настраиваемая конечная точка наследуется от ControllerBase и имеет 3 метода (GET, POST, DELETE).

Я намерен вызывать настраиваемую конечную точку из другого API, используя выделенного клиента с учетными данными (сервер-сервер), реализованного как HttpClientв .NET Core.В этом не участвует ни один пользователь.

Для получения токена доступа я использую IdentityModel DiscoveryClient и TokenEndpoint.

Итак, в общем, до сих пор я сделал следующее:

  1. настроить «обычный» сервер идентификации и проверить его работоспособность -> он работает
  2. реализовать настраиваемую конечную точку и протестировать ее без авторизации -> он работает
  3. добавить другой ресурс API («api.auth»)) с настраиваемой областью «api.auth.endpoint1»
  4. настроить клиент с учетными данными клиента, разрешающими доступ к области «api.auth.endpoint1».
  5. реализовать HttpClient и настройку теста ->Я получаю токен доступа через конечную точку токена модели идентификации.

Теперь, когда я вызываю конечную точку, используя HttpClient с полученным токеном доступа, я получаю код ответа 200 (ОК), но содержимоеСтраница входа в систему сервера идентификации.

В документации Identity Server 4 указано использование

   services.AddAuthentication()
    .AddIdentityServerAuthentication("token", isAuth =>
    {
        isAuth.Authority = "base_address_of_identityserver";
        isAuth.ApiName = "name_of_api";
    });

, а также

   [Authorize(AuthenticationSchemes = "token")]

UnfortunatЛи компилятор заявляет, что .AddIdentityServerAuthentication не может быть найден.Я пропускаю специальный нюгет?

Нюгетами, которые я до сих пор использую на сервере токенов, являются:

  • IdentityServer4 (v2.2.0)
  • IdentityServer4.AspNetIdentity (v2.1.0)
  • IdentityServer4.EntityFramework (v2.1.1)

Разобрался с этой частью.Пропущенный nuget для AddIdentityServerAuthentication:

  • IdentityServer4.AccessTokenValidation

Борьба с авторизацией на основе настраиваемой области.

Кто-нибудь знает, как безопасностьдолжен быть настроен?

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

Пользовательская схема проверки подлинности и основанные на области действия политики для различных прав доступа, связанных вместе, выглядят так:

// Startup.ConfigureServices
services
  .AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
  .AddIdentityServerAuthentication("CustomAuthEndpointsAuthenticationScheme", options =>
  {
    options.Authority = "http://localhost:5000";
    options.ApiName = "api.auth"; //IdentityServer4.Models.ApiResource.Name aka Audience
  });

services.AddAuthorization(options => 
{
  options.AddPolicy("Endpoint1Policy", policy => {
    policy.AddAuthenticationSchemes(new string[] { "CustomAuthEndpointsAuthenticationScheme" });
    policy.RequireScope("api.auth.endpoint1"); } ); //IdentityServer4.Models.Scope.Name
  options.AddPolicy("Endpoint2Policy", policy => {
    policy.AddAuthenticationSchemes(new string[] { "CustomAuthEndpointsAuthenticationScheme" });
    policy.RequireScope("api.auth.endpoint2"); } ); //IdentityServer4.Models.Scope.Name
} );

// securing the custom endpoint controllers with different access rights
[Authorize(AuthenticationSchemes = "CustomAuthEndpointsAuthenticationScheme", Policy = "Endpoint1Policy")] 

Кажется, что это не мешает конечным точкам по умолчанию IdentityServer4 или части удостоверения ASP.NET Core.

0 голосов
/ 23 октября 2018

Сконфигурируйте клиента с помощью ClientGrantTypes = client_credentials и вашего API, например:

services
    .AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddIdentityServerAuthentication(options =>
    {
        options.Authority = "http://localhost:5000";
        options.ApiName = "api.auth";
    });

Где ApiName - это имя ресурса .Обратите внимание, что resource! = Scope .В большинстве примеров имя ресурса совпадает с именем области.Но не в вашем случае, когда имя ресурса api.auth и имя области api.auth.endpoint1.

Настройте клиент для запроса scope .

var tokenClient = new TokenClient(disco.TokenEndpoint, clientId, secret);
var tokenResponse = await tokenClient.RequestClientCredentialsAsync("api.auth.endpoint1");

IdentityServer выполнит поиск имени ресурса и добавит его в маркер как аудиторию (aud), а область будет добавлена ​​как заявка с типом scope.

Этого должно быть достаточно, чтобы оно работало.Также проверьте пример проекта .

...