в приложении .NET я пытаюсь аутентифицировать пользователей по имени пользователя и паролю против пользователей Windows, как локальных, так и пользователей домена. Я уже пробовал это решение .Мой код для получения PrincipalContext выглядит следующим образом:
protected static PrincipalContext TryCreatePrincipalContext(String domain)
{
var computerDomain = TryGetComputerDomain();
if (String.IsNullOrEmpty(domain) && String.IsNullOrEmpty(computerDomain))
return new PrincipalContext(ContextType.Machine);
else if (String.IsNullOrEmpty(domain))
return new PrincipalContext(ContextType.Domain, computerDomain);
else
return new PrincipalContext(ContextType.Domain, domain);
}
protected static String TryGetComputerDomain()
{
try
{
var domain = Domain.GetComputerDomain();
return domain.Name;
} catch
{
return null;
}
}
Это прекрасно работает для пользователей локальных окон и удаленных пользователей в ActiveDirectory.Но если я попытаюсь запустить проверку подлинности на компьютере, то он присоединится к не-ActiveDirectory Domain Master, например.Сервер Samba Я получаю следующее исключение:
System.DirectoryServices.AccountManagement.PrincipalServerDownException: Mit dem Server konnte keine Verbindung hergestellt werden. --->
System.DirectoryServices.Protocols.LdapException: Der LDAP-Server ist nicht verfügbar.
bei System.DirectoryServices.Protocols.LdapConnection.Connect()
bei System.DirectoryServices.Protocols.LdapConnection.SendRequestHelper(DirectoryRequest request, Int32& messageID)
bei System.DirectoryServices.Protocols.LdapConnection.SendRequest(DirectoryRequest request, TimeSpan requestTimeout)
bei System.DirectoryServices.Protocols.LdapConnection.SendRequest(DirectoryRequest request)
bei System.DirectoryServices.AccountManagement.PrincipalContext.ReadServerConfig(String serverName, ServerProperties& properties)
--- Ende der internen Ausnahmestapelüberwachung ---
bei System.DirectoryServices.AccountManagement.PrincipalContext.ReadServerConfig(String serverName, ServerProperties& properties)
bei System.DirectoryServices.AccountManagement.PrincipalContext.DoServerVerifyAndPropRetrieval()
bei System.DirectoryServices.AccountManagement.PrincipalContext..ctor(ContextType contextType, String name, String container, ContextOptions options, String userName, String password)
bei System.DirectoryServices.AccountManagement.PrincipalContext..ctor(ContextType contextType, String name)
bei DomainAuthTest.DomainAuthenticator.TryCreatePrincipalContext(String domain)
bei DomainAuthTest.DomainAuthenticator.Authenticate(String domainUser, String password)
bei DomainAuthTest.Program.Main(String[] args)
Таким образом, кажется, что PrincipalContext пытается использовать LDAP в случае ContextType.Domain.Если я пытаюсь использовать ContextType.Machine, я не могу использовать имя рабочей группы / домена, так как PrincipalContext пытается подключиться напрямую к машине.Это не удастся, если уже есть подключение к этой машине с этими окнами с той же машины.
Так что мой вопрос:
- Как аутентифицировать пользователя с доменом учетных данных, имя пользователяи пароль к хозяину домена, который не обязательно основан на ActiveDirectory?
- Существуют ли управляемые API для выполнения описанной выше задачи?
- Если не существует управляемых базовых классов, что такоеправильное направление, чтобы сделать это с?
Спасибо за ваши ответы.