IdentityServer4 со встроенной аутентификацией Windows

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

Прямо сейчас я пытаюсь заставить Аутентификацию Windows (против AD) работать. Сначала позвольте мне показать вам, как я хочу, чтобы это работало, затем я покажу вам, что я пробовал.

Любой пользователь, вошедший в AD, должен иметь возможность запрашивать токен из конечной точки токена. Поэтому для любого приложения со встроенной аутентификацией Windows оно должно работать автоматически.

Вот пример того, как я хотел бы работать в PowerShell. Я не уверен, как именно должно выглядеть тело, но надеюсь, вы поняли.

$cred = Get-Credential
$body = @{grant_type='client_credentials';client_id='client'}
Invoke-RestMethod http://localhost:5000/connect/token -Method POST -Credential $cred -Body $body

Поэтому я изучил примеры быстрого запуска IdentityServer4 и прочитал документы по аутентификации Windows. Я взял самый простой пример быстрого запуска и попытался изменить его для работы с аутентификацией Windows.

Пример использования WebHost.CreateDefaultBuilder для сервера, что означает, что Kestrel должен быть автоматически настроен (в соответствии с документами). Тогда я модифицирую ConfigureServices соответственно:

public void ConfigureServices(IServiceCollection services)
{
    services.AddIdentityServer()
        .AddDeveloperSigningCredential()
        .AddInMemoryApiResources(Config.GetApiResources())
        .AddInMemoryClients(Config.GetClients());

    services.Configure<IISOptions>(iis =>
    {
        iis.AuthenticationDisplayName = "Windows";
        iis.AutomaticAuthentication = false;
    });
}

и в launchSettings.json Я поставил

iisSettings": {
    "windowsAuthentication": true,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:5000/",
      "sslPort": 0
    }
  }

Тем не менее, это не работает. Когда я запускаю сервер и пытаюсь запросить токен с помощью приведенного выше сценария PowerShell, я получаю следующий журнал ошибок от IdentityServer:

[10:24:56 Debug] IdentityServer4.Validation.ClientSecretValidator
Start client validation

[10:24:56 Debug] IdentityServer4.Validation.BasicAuthenticationSecretParser
Start parsing Basic Authentication secret

[10:24:56 Debug] IdentityServer4.Validation.PostBodySecretParser
Start parsing for secret in post body

[10:24:56 Debug] IdentityServer4.Validation.PostBodySecretParser
client id without secret found

[10:24:56 Debug] IdentityServer4.Validation.SecretParser
Parser found secret: PostBodySecretParser

[10:24:56 Debug] IdentityServer4.Validation.SecretParser
Secret id found: client

[10:24:56 Debug] IdentityServer4.Validation.HashedSharedSecretValidator
Hashed shared secret validator cannot process NoSecret

[10:24:56 Debug] IdentityServer4.Validation.SecretValidator
Secret validators could not validate secret

[10:24:56 Error] IdentityServer4.Validation.ClientSecretValidator
Client secret validation failed for client: client.

[10:24:56 Verbose] IdentityServer4.Hosting.IdentityServerMiddleware
Invoking result: IdentityServer4.Endpoints.Results.TokenErrorResult

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

1 ответ

В журналах сказано, что вы скучаете по секрету клиента.

Но здесь тебе больше не хватает. Вы пытаетесь использовать тип предоставления учетных данных клиента. Из того, что я понял из ваших объяснений, вы хотите пройти аутентификацию с текущим пользователем Windows, я прав?

Если так - ваш подход неверен. Тип предоставления учетных данных клиента предназначен для аутентификации клиента (приложение). Другими словами - оно будет аутентифицировать само приложение (независимо от того, является ли он вашим сценарием PowerShell, консольным приложением или чем-то еще), но не пользователь, который его использует.

Например, если мы (я и вы) выполняем один и тот же сценарий на разных компьютерах под разными учетными данными пользователя, мы все равно получим те же утверждения в маркере доступа, поскольку мы аутентифицированы как клиент.

Обратитесь к документации по конечной точке токена для получения дополнительных опций.

Если вы хотите получить токен, основанный на имени пользователя и пароле, вам нужно использовать тип предоставления пароля.

Надеюсь, что это поможет и даст вам некоторые подсказки.

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