2014-10-21 3 views
0

사용자가 로밍 프로필 사용자 계정을 사용하여 로그인하는 mvc4 웹 응용 프로그램이 있습니다. Active Directory을 통해 인증합니다. 그리고 거의 모든 방법에서 일부 파일 작업을하기 위해 로그인 한 사용자를 가장해야합니다.전체 세션을 통해 가장 할 수 있습니까?

가 나는 흉내를위한 다음 방법을 사용하십시오

[DllImport("advapi32.dll", SetLastError = true)] 
public static extern int LogonUser (string lpszUsername, string lpszDomain, string lpszPassword, int dwLogonType, int dwLogonProvider, out IntPtr phToken); 

[DllImport("advapi32.dll", SetLastError = true)] 
public static extern int ImpersonateLoggedOnUser (IntPtr hToken); 

[DllImport("advapi32.dll", SetLastError = true)] 
static extern int RevertToSelf(); 

[DllImport("kernel32.dll", SetLastError = true)] 
static extern int CloseHandle (IntPtr hObject); 

private IntPtr lnToken; 

내가 IDisposable 클래스로 내 impersonater을 구현하고 constructor에서 내가 가장하고 Dispose 방법에 나는 나의 가장 전에 켜져 사용자에게 되돌립니다. 그래서 이렇게 내 컨트롤러 방법에 쉽게 using 문에서 사용할 수 있습니다 :

public ActionResult SomeAction (string param) 
{ 
    using (new Impersonator(username, password, nameSpace)) 
    { 
     /// do staff 
    } 
} 

를이 방법은 잘 작동, 나는이 약 1.5 초 I에 대한 웹 사이트의 응답 시간을 느리게한다는 생각하지만 이것을 조금 성가신 찾으십시오.

내가 로그 아웃하거나 세션이 종료 될 때 사용자가 로그인하고 되돌릴 때 가장을 만들 수 있습니까? 즉 세션을 통해 가장 (impersonation)을 유지할 수 있습니까?

정확한 용어를 사용하지 않았을 수 있습니다. 죄송합니다.

+0

IIS가 인증을 처리한다고 가정 할 수 있습니까? 우리는이 응용 프로그램과 함께 이렇게, 그리고 IIS는 또한 당신을 위해 가장을 처리 - 전체 요청은 사용자의 컨텍스트에서 실행됩니다 –

+0

예 IIS에서 내 웹 사이트를 실행합니다. 그러나 IIS가 로그인 할 때마다 다른 방법으로 가장 할 수 있습니까? 또는 IIS에서 응용 프로그램 풀의 ID에 대해 이야기하고 있습니까? –

+0

예, 각 사용자는 개별적으로 가장합니다. 이 시점에서 상황은 앱 풀의 보안 컨텍스트가 아닌 보안 컨텍스트에서 실행됩니다. –

답변

1

가능하다면이 시나리오에서 IIS를 사용하여 인증과 가장을 수행하는 것이 좋습니다. 당신이 경우

  • ASP.NET Impersonisation
  • 해제 익명 인증 사용 (도메인 외부에서 클라이언트가있는 경우)
  • (도메인 내에서 클라이언트가있는 경우)
Windows Authentication을 사용 Basic Authentication 사용

사람들이 사이트에서 페이지를 요청하면 IIS는 브라우저에 HTTP 401 Challenge를 발급합니다. 동일한 도메인 내에 있고 브라우저가이를 지원하면 (IE와 Chrome이 자동으로 수행함), 현재 사용자는 자동으로 사이트에 로그온합니다. 도메인 외부에있는 경우 브라우저는 인증을위한 로그인 상자를 제공합니다.

기본 인증을 사용하는 경우 자격 증명이 일반 텍스트 형식으로 전송되기 때문에 안전하게 https 연결이되어 있어야합니다.

일단 IIS에서 인증을 받으면 요청은 .Net에 도착합니다.이 시점에서 응용 프로그램 풀 대신 사용자의 보안 컨텍스트에서 실행됩니다.

System.Security.Principal.WindowsIdentity.GetCurrent().Name 

으로 전화하면 가장 된 사용자가 표시됩니다.

관련 문제