2010-06-07 2 views
5

를 포기하지 않습니다 사칭 - ... 그리고 그것은 그럼에도 불구하고 일잘못된 도메인의 사용자가 I 공통 가장 코드를 사용하고 난 임의 'dggdgsdg'를 삽입 도메인 때까지, 잘했다 예외를

if (LogonUser(Username, Domain, Password, Logon32LogonInteractive, Logon32ProviderDefault, ref existingTokenHandle) && 
    DuplicateToken(existingTokenHandle, (int)SecurityImpersonationLevel.SecurityDelegation, ref duplicateTokenHandle)) 
    { 
      Identity = new WindowsIdentity(duplicateTokenHandle); 
      ImpersonationContext = Identity.Impersonate(); 
    } 
    else 
    { 
      throw new Win32Exception(Marshal.GetLastWin32Error()); 
    } 

내 도메인에서 일부 TestUser를 사용하고 효과가있었습니다. 그런 다음 도메인을 임의의 넌센스 'werwerhrg'로 전환했으며 내 도메인에서 TestUser로 위장한 것입니다! 왜? 나는 던져 질 예외를 기대할 것인데, 왜 지구상에서 작동 하는가?

private const int Logon32LogonInteractive = 2; 
private const int Logon32ProviderDefault = 0; 

public enum SecurityImpersonationLevel 
     { 
      SecurityAnonymous = 0, 
      SecurityIdentification = 1, 
      SecurityImpersonation = 2, 
      SecurityDelegation = 3 
     } 
[DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Unicode)] 
private static extern bool LogonUser(String lpszUsername, String lpszDomain, String lpszPassword, int dwLogonType, int dwLogonProvider, ref IntPtr phToken); 

[DllImport("kernel32.dll", CharSet = CharSet.Auto)] 
private extern static bool CloseHandle(IntPtr handle); 

[DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
private static extern bool DuplicateToken(IntPtr existingTokenHandle, int securityImpersonationLevel, ref IntPtr duplicateTokenHandle); 
+1

일반적으로 도메인 인증에서는 내가 본 사용자 이름/도메인이 결합 된 것입니다. MyDomain \ TestUser 또는 TestUser @ MyDomain을 지정합니다. 그런 사용자 이름을 지정하고 어떤 일이 일어나는지보십시오. 귀하의 컴퓨터가 대상 도메인의 구성원이고 어떻게 든 지정된 도메인 대신 해당 도메인에서 사용자를 사용하려고 시도한 것 같습니다. –

+0

@Tim, 나는 그것을 시험했다, 행운이 없다. username으로 'domain \ testUser'를 지정하면 '알 수없는 사용자 이름 또는 잘못된 비밀번호'예외가 발생합니다. – Rita

+1

P/Invoke 선언을 게시하십시오. –

답변

4

나는 대답이 인증이 수행되는 방법에 있다고 믿습니다. LogonUser은 실행 된 로컬 컴퓨터에 로그온을 시도합니다. 이 컴퓨터가 도메인에 있으면 암호가 AD 컨트롤러에 대해 확인되고 확인됩니다.

그러나 도메인을 제공하면 자신의 로컬 사용자베이스에 대한 인증을 찾을 수 없습니다. 로컬에서는 NTLM을 사용합니다 (NTLM은 클라이언트와 서버가 동일한 시스템 일 때 사용됩니다). NTLM은 암호 해시 및 사용자 이름을 확인하고 도메인 이름 (ref doc)을 사용하지 않습니다.

UPN format instead and set domain to null을 사용하는 경우 도메인이 존재하지 않고 원하는 결과를 얻으면 오류가 발생합니다.

두 컴퓨터에서 암호 B를 사용하여 사용자 A를 만든 것과 비슷합니다. 그런 다음 해당 사용자는 로그온하지 않고도 로컬 권한이있는 다른 컴퓨터에 액세스 할 수 있습니다.

이 모든 것이 도메인 세계의 로컬 계정 (적어도 동일한 사용자 이름, 접두사)으로 머물러 있어야하며 도메인이 아닌 컴퓨터가 서로를 볼 수 없어야하는 이유입니다. 네트워크. NTLM 대신 Kerberos를 사용해야하는 이유는 무엇입니까?

+0

대단히 감사합니다! – Rita