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, консольным приложением или чем-то еще), но не пользователь, который его использует.
Например, если мы (я и вы) выполняем один и тот же сценарий на разных компьютерах под разными учетными данными пользователя, мы все равно получим те же утверждения в маркере доступа, поскольку мы аутентифицированы как клиент.
Обратитесь к документации по конечной точке токена для получения дополнительных опций.
Если вы хотите получить токен, основанный на имени пользователя и пароле, вам нужно использовать тип предоставления пароля.
Надеюсь, что это поможет и даст вам некоторые подсказки.