[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):

  1. Создан 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"

  1. Создан MyClientStore, который реализует IClientStore
  2. Создал MyScopeStore, который реализует IScopeStore
  3. Зарегистрировано это на заводе следующим образом:

    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 или даже для каждого клиента.

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