2015-01-09 2 views
2

WebAPI를 사용하고 Katana와 함께 호스팅하고 있습니다. 지금 인증과 권한 부여에 사용될 미들웨어를 작성 중입니다. 요청은 다양한 플랫폼에서 이루어질 수 있으므로 SSL을 통한 기본 인증을 사용해야합니다. OAuth는 현재로서는 옵션이 아닙니다. 미들웨어는 기본 인증에서 제공 한 사용자 이름과 암호를 가져 와서 사용자가 로컬 Windows 그룹의 구성원인지 확인해야합니다.사용자 이름과 암호로 WindowsPrincipal을 얻는 방법

지금 당장 WindowsPrincipal을 만드는 방법을 알아 내려고 노력 중입니다. 사용자 이름과 암호로 WindowsPrincipal을 만드는 방법을 파악할 수 있다면 나머지 작업 방법을 알고 있습니다. 여기 내가 지금 가지고있는 것이있다.

//TODO 
    WindowsPrincipal userPrincipal = null; //This is where I need to take the username and password and create a WindowsPrincipal 
    Thread.CurrentPrincipal = userPrincipal; 

    AppDomain.CurrentDomain.SetPrincipalPolicy(System.Security.Principal.PrincipalPolicy.WindowsPrincipal); 
    PrincipalPermission permission = new PrincipalPermission(null, "Local Group Name"); 
    permission.Demand(); 

회원이 특정 그룹에 속해 있는지 확인하기 위해 사용자 이름과 비밀번호를 사용하는 좋은 방법을 찾기 위해 고심하고 있습니다. 이 작업을 수행하는 가장 좋은 방법은 무엇입니까? 사전에 도움을 주셔서 감사합니다.

답변

2

실제로 나는 그 정보를 얻기 위해 WindowsPrincipal 대신 WindowsIdentity를 사용해야한다고 생각합니다.

당신이 P /를 advapi32.dll의에서 LogonUser()를 호출해야합니다 사용자 가장/aquire 방법 : 위의 클래스에서 "기본"임을 고려

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

를, 사용자를 가장하는 것은 다음과 같은 것 :

var userToken = IntPtr.Zero; 

var success = Native.LogonUser(
    "username", 
    "domain", 
    "password", 
    2, // LOGON32_LOGON_INTERACTIVE 
    0, // LOGON32_PROVIDER_DEFAULT 
    out userToken); 

if (!success) 
{ 
    throw new SecurityException("User logon failed"); 
} 

var identity = new WindowsIdentity(userToken); 

if(identity.Groups.Any(x => x.Value == "Group ID")) 
{ 
    // seems to be in the group! 
} 

현재 기본 통화에 대한 추가 정보를 찾을 수 있습니다 여전히 WindowsPrincipal에 액세스해야하는 경우 http://msdn.microsoft.com/en-us/library/windows/desktop/aa378184%28v=vs.85%29.aspx

+0

그런데을 수행 할 수 있습니다 장군 WindowsIdentity에서 빠져 나오십시오. WindowsPrincipal principal = 새 WindowsPrincipal (신원); – pysco68

+1

매력처럼 작동합니다. 도와 주셔서 감사합니다! 이 접근 방식에 대한 마지막 질문입니다. 관리 코드에서 원시 코드를 호출하는 데 많은 경험이 없으며 모든 관리되지 않는 리소스를 정리해야합니다. kernel32.dll에서 CloseHandle()을 사용하면 userToken에 대한 핸들을 닫아야합니다. 제가 놓친 원주민 전화와 관련하여 정리해야 할 것이 있습니까? –

+0

사실 사용자 토큰이 더 이상 필요하지 않으면 실제로 다른 작업을 수행하지 않아도 CloseHandle()을 호출 할 수 있습니다. 필자는 WindowsIdentity의 수명이 토큰의 수명과 관련이 없다고 생각하지만, 직접 사용해 보시기 바랍니다! – pysco68

관련 문제