2009-06-09 3 views
0

System.Security.Principal.WindowsIdentity.Impersonate 함수는 System.intptr 매개 변수를 사용합니다. 이는 내 제한된 이해로 인해 내 상황에서 무용지물이 될 수 있습니다."impersonate"함수를 intptr 대신 문자열 (사용자 이름)과 함께 사용할 수 있습니까?

통합 보안을 사용하여 사용자가 Windows Identity와 관련된 역할에 대해 페이지 단위로 사용자를 인증하는 인트라넷 응용 프로그램을 개발 중입니다. 비밀번호가 없거나 그런 종류의 것이 없습니다. Windows 사용자 이름. 테스트 목적으로 사용자 이름을 기반으로 Windows 사용자를 가장 할 수 있습니까? "가장"메소드가 나에게 분명하게 뛰어 났지만 예상치 못한 매개 변수가 필요합니다. 사전 :

답변

3

간단히 말해서, 아니요. 그러나 당신은 올바른 길을 가고 있습니다. LoginUserA (C Win32 API)로 로그인을 시뮬레이트하여 사용자를 얻거나 IIS 사이트를 Windows 인증으로 설정해야합니다.

이 경우 페이지에는 IPrincipal 유형의 User라는 속성이 있으며이 속성을 사용하여 해당 사용자로 실행할 수 있습니다. 예를 들어 (미안, C# 코드).

IPrincipal p = this.User; 
WindowsIdentity id = (WindowsIdentity)p.Identity; 
WindowsImpersonationContext wic = id.Impersonate(); 
try { 
    // do stuff as that user 
} 
finally { 
    wic.Undo(); 
} 
0

사용자 토큰 (로 가장의를 IntPtr가 나타내는 값)에

덕분에 사용자 이름 이상을 나타냅니다. 이것은 사용자, 인증 토큰, 현재 보안 권한 등에 대한 정보가 포함 된 내부 Windows 컨텍스트의 핸들입니다.이 때문에 암호없이 가장 할 수 없습니다. LogonUser method을 통해 토큰을 생성하려면 실제로 "로그인"해야합니다.

과거에 내가 해왔 던 것은 코드 또는 구성 파일에 보관할 수있는 비밀번호가있는 특별한 "테스트"사용자 계정을 만드는 것입니다.

+0

상황에 따라이 솔루션을 사용할 수 있을지 확신하지 못합니다. 개발주기의 후반부에 들어서서 테이블과 인프라를 변경하지 않도록 시스템을 해킹해야했습니다. WindowsIdentity.getCurrent() 객체를 사용하고 "Username"열에 대해 해당 문자열을 일치시킵니다. 테이블은 사용자 이름 외에 사용자의 Windows 계정에 대한 정보를 저장할 수 없습니다. – Chris

0

역할 구성원을 확인하기 위해 가장 할 필요는 없습니다. 단순히 UPN 규칙에 따라 사용자 이름에서 생성 된 UPN (userPrincipalName)을 취하는 WindowsIdentity에 constructor을 사용하고 해당 ID로 WindowsPrincipal을 만들고 IsInRole을 사용하여 그룹의 구성원을 확인하십시오. 이것은 W2K3 및 Windows 2003 도메인에서 작동하지만 다른 상황에서는 작동하지 않습니다.

var userIdentity = new WindowsIdentity(username + "@domain"); 
var principal = new WindowsPrincipal(userIdentity); 
var inRole = principal.IsInRole("roleName"); 

는 또한 표준 또는 회원 자격을 확인하는 역할 인터페이스를 사용 할 수 있도록 사용자 지정 역할 공급자를 사용하는 것이 좋습니다.

1

WindowsPrincipal에서 특정 Windows를 사용하고 있습니까? 아니면 사용자를 관리하지 않고 auth/auth를 얻는 편리한 방법입니까? Windows 기반이 필요한 경우 Serapth는 올바른 방법을 제공합니다. 편리한 인증/인증 저장소로 사용하는 경우 IPrincipal과 인터페이스하기 위해 코드를 작성해야합니다. 그런 다음 테스트 및 응용 프로그램의 특성에 따라 HttpContext.User 또는 Thread.CurrentThread.Principal에 원하는 값을 가진 IPrincipal의 구현을 삽입 할 수 있습니다.

관련 문제