В настоящее время я работаю над проектом, в котором я пытаюсь настроить службу на основе IdentityServer4 (https://github.com/IdentityServer/IdentityServer4), которая аутентифицирует пользователей, запрашивая локальную Active Directory через LDAP.
Для этого я также включил IdentityServer4.LdapExtension (https://github.com/Nordes/IdentityServer4.LdapExtension) в свой проект. Рабочий пример из репозитория работает нормально (https://github.com/Nordes/IdentityServer4.LdapExtension/tree/master/Sample/IdentityServer), но настраиваемая логика является частью пользовательского интерфейса, и мне нужно, чтобы моя служба работала без какого-либо пользовательского интерфейса.
Просто добавив
.AddLdapUsers<ActiveDirectoryAppUser>(Conf.GetSection("ldap"), UserStore.InMemory)
как описано в документации, не меняет конвейер запросов, поскольку предоставленные методы входа / проверки никогда не выполняются - они запускаются только вызовами из пользовательского интерфейса (AccountController). Однако, как я уже сказал, я не хочу интегрировать какой-либо пользовательский интерфейс в эту службу и предпочитаю использовать интерфейс, который уже предоставляет Token-Endpoint (запрос POST с client_id и client_secret, ответ с JWT).
Есть ли способ интегрировать аутентификацию LDAP, не переписывая большие части, которые работают как надо?
Судя по вашему вопросу, похоже, что у вас уже есть username
и password
. Обратите внимание: client_id
! = username
и client_secret
! = password
. client_id
- это идентификатор клиентского приложения.
Тип разрешения, который вы пытаетесь использовать, называется Пароль владельца ресурса при использовании конечной точки авторизации или пароль при использовании конечной точки маркера. Этот тип разрешения используется для поддержки устаревших систем и не рекомендуется для новых разработок.
Код, который вы хотите выполнить для аутентификации пользователя, находится в LdapUserResourceOwnerPasswordValidator.cs, и он должен быть выполнен, если вы передадите правильные параметры в конечную точку токена:
POST /connect/token
client_id=yourclientid& client_secret=yourclientsecret& grant_type=password& username=yourusername&password=yourusernamespassword
См. Документацию по конечной точке токена: https://identityserver4.readthedocs.io/en/release/endpoints/token.html
Вы можете использовать Модель идентичности, чтобы помочь вам сделать запрос токена:
var response = await client.RequestPasswordTokenAsync(new PasswordTokenRequest
{
Address = "https://demo.identityserver.io/connect/token",
ClientId = "yourclientid",
ClientSecret = "yourclientsecret",
UserName = "yourusername",
Password = "yourusernamespassword"
});
Это задокументировано здесь https://identitymodel.readthedocs.io/en/latest/client/token.html
Большое спасибо! Намек на то, что client_id / secret НЕ являются именем пользователя / паролем, действительно помог .... когда я отправляю запрос с использованием grant_type «пароль» и указываю client_id, client_secret, имя пользователя и пароль, как описано, он запрашивает Active Directory по желанию.