2010-12-07 5 views
2

인증을 위해 System.DirectoryServices 및 LDAP를 사용하는 .Net 클라이언트 WPF 응용 프로그램이 있습니다. 앱을 시작할 때 사용자가 자신의 도메인 계정 (Windows에 로그인 한 방법)을 사용하여 다시 인증하도록합니다. 연결이 가능할 때 다음을 사용하여 인증을 수행 할 수 있음을 이해합니다..Net을 사용하여 연결이 끊어지면 Active Directory에 대해 인증합니다.

DirectoryEntry entry = new DirectoryEntry("LDAP://" + domain, 
      userName, password); 

주름은 응용 프로그램이 연결되지 않은 원격 사용자에 의해 사용되는 경우입니다. Windows 자체는 도메인 사용자가 연결이 끊긴 경우에도 사인온 할 수 있습니다. .Net Framework를 사용하여 연결이 끊긴 환경에서 사용자를 인증하는 비슷한 방법이 있습니까?

답변

2

나는 advapi32.dll의 LogonUser 기능을 사용하여이 작업을 수행 할 수있는 방법을 찾았습니다. 분리 할 때

Dim tokenHandle As New IntPtr(0) 
Const LOGON32_PROVIDER_DEFAULT As Integer = 0 
Const LOGON32_LOGON_INTERACTIVE As Integer = 2 
tokenHandle = IntPtr.Zero 
Dim returnValue As Boolean = LogonUser("<username>", "<domain>", "<password>", LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, tokenHandle) 

Private Declare Auto Function LogonUser Lib "advapi32.dll" (ByVal lpszUsername As [String], _ 
         ByVal lpszDomain As [String], ByVal lpszPassword As [String], _ 
         ByVal dwLogonType As Integer, ByVal dwLogonProvider As Integer, _ 
         ByRef phToken As IntPtr) As Boolean 

이의 마지막 로그의 로컬 캐시 된 버전에 대해 유효성을 검사 나타납니다.

+0

예. 올바른 방법입니다. –

+0

위의 코드는 암호를 문자열로 전달합니다. 보다 안전한 방법은 암호를 보안 문자열로 가져와 관리되지 않는 메모리에 마샬링 한 다음 암호를 IntPtr로 전달하는 것입니다. [MSDN] (http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshal.securestringtoglobalallocunicode (v = vs.100) .aspx)의 예제를 참조하십시오. – bkstill

2

연결이없는 경우 연결되지 않습니다. Windows는 해당 사용자에 대한 마지막 로그인의 캐시 된 버전을 유지합니다. 이는 새 사용자가 도메인에 연결되지 않은 시스템에 로그인 할 수 없음을 의미합니다. 로컬 시스템 인증을 사용하여 어떤 사용자가 시스템을 사용 중인지 확인하고이를 기반으로 로컬 캐시 된 권한을 판별 할 수 있습니다. 이러한 메서드는 여전히 System.DirectoryServices 네임 스페이스 내에 있지만 쿼리 구문 분석 위치는 변경 될 수 있습니다 (LDAP 쿼리를 로컬로 수락 할 수 없다고 생각합니다).

편집 :
당신은 이러한 요구를 촉진 할 System.Security/System.Security.Permissions 네임 스페이스와 몇 가지 클래스를 찾을 수 있습니다.

+0

도메인 컨트롤러에 로그인하지 않으면 LDAP 쿼리가 허용되지 않습니다.이 경우에는 문제가되지 않습니다. – CodingGorilla

+0

@Coding Gorilla - Tru dat. 필자의 가정은 이것이 원격 시스템의 응용 프로그램을위한 것이라고 생각했습니다. 당신이 DC에 있다면, 네트워크는 결코 기술적으로 단절되지 않습니다. –

+0

예. 이것은 네트워크 연결이없는 주기적으로 단절된 환경에 있습니다. 권한 확인에 대해 알아 봤지만 이미 로그인 한 사용자를 실제로 다시 인증 할 수있는 방법을 찾지 못했습니다. 즉, 응용 프로그램이 실행되기 전에 자격 증명을 다시 요구하고 인증을받습니다. – bkstill

관련 문제