[C#, .NET]: проверка пользователей через LDAP через IdentityServer3
Мне нужен способ проверки пользователей в моей организации (с использованием LDAP и Active Directory) через IdentityServer3 и предоставления им доступа к ресурсу.
IdentityServer3 является структурой реализации протокола OpenID Connect, которая подходит для аутентификации и авторизации.
До сих пор мне удавалось проверять жестко запрограммированных пользователей и получать токен доступа JWT (JSON Web Token) с помощью реализации InMemory.
Пожалуйста, обратитесь к этому примеру:
https://rajdeep.io/2015/05/07/creating-a-single-sign-on-using-thinktecture-identity-server-part-1/
Однако это не очень полезно в моем сценарии, когда мне придется проверять пользователей (хранящихся в активном каталоге) в большой организации и выдавать им токены для доступа к ресурсу.
Вот что я сделал по этой ссылке
(http://stackru.com/questions/31536420/thinktecture-identityserver-v3-with-windowsauth
):
Создан ActiveDirectoryUserService, который реализует IUserService.
namespace LDAPSSO { public class ActiveDirectoryUserService : IUserService { private const string DOMAIN = "company domain"; public Task<AuthenticateResult> AuthenticateExternalAsync(ExternalIdentity externalUser, SignInMessage message) { return Task.FromResult<AuthenticateResult>(null); } public Task<AuthenticateResult> AuthenticateLocalAsync(string username, string password, SignInMessage message) { try { using (var pc = new PrincipalContext(ContextType.Domain, DOMAIN)) { if (pc.ValidateCredentials(username, password)) { using (var user = UserPrincipal.FindByIdentity(pc, IdentityType.SamAccountName, username)) { if (user != null) { return Task.FromResult(new AuthenticateResult(subject: Guid.NewGuid().ToString(), name: username)); } } } // The user name or password is incorrect return Task.FromResult<AuthenticateResult>(null); } } catch { // Server error return Task.FromResult<AuthenticateResult>(null); } } } }
Ссылка:" https://gist.github.com/tjrobinson/0ad6c790e90d7a385eb1"
- Создан MyClientStore, который реализует IClientStore
- Создал MyScopeStore, который реализует IScopeStore
Зарегистрировано это на заводе следующим образом:
public class Factory { public static IdentityServerServiceFactory Configure() { var factory = new IdentityServerServiceFactory { UserService = new Registration<IUserService, ActiveDirectoryUserService>(), // Don't need, but mandatory for idsvr3 ClientStore = new Registration<IClientStore, MyClientStore>(), ScopeStore = new Registration<IScopeStore, MyScopeStore>() }; return factory; }
Даже если бы у меня это работало, не нужно ли это сравнивать с введенными пользователем учетными данными через форму входа, которую предоставляет сервер идентификации? (Пожалуйста, смотрите изображение ниже):
Что мне нужно сделать, чтобы извлечь учетные данные пользователя со страницы входа в IdentityServer3 и проверить их в Active Directory?
Это правильный подход? Пожалуйста, предложите.
Входы и предложения приветствуются.
Заранее спасибо!
1 ответ
Я бы реализовал Active Directory в качестве внешнего поставщика удостоверений.
Таким образом, вам не нужно поддерживать какой-либо пользовательский код и продолжать использовать функции LDAP AD, если вы заблокированы в них. Вы можете сделать это своим единственным провайдером идентификации, отключив локальный вход в систему на Identity Server или используя idp
значение в acr_values
или даже для каждого клиента.