2011-12-21 5 views
0

그래서 나는이 머리에 머리를 치고있다.자체 호스팅 WCF WebServiceHost를 사용하는 가장이 '작업 오류가 발생했습니다.' 오류

var webServiceHost = new WebServiceHost(helloWorld); 
webServiceHost.Authorization.ImpersonateCallerForAllOperations = true; 

var uri = new Uri(BaseUri + webService.UriDirectory); 
var webHttpBinding = new WebHttpBinding(webHttpSecurityMode); 
webHttpBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows; 

var sep = webServiceHost.AddServiceEndpoint(IHelloWorld, webHttpBinding, uri); 
var webHttpBehavior = new WebHttpBehavior {HelpEnabled = true}; 
sep.Behaviors.Add(webHttpBehavior); 

webServiceHost.Open(); 

내가 앞서 간 내 방법 다음과 같은 속성 적용한 : 나는 자체 호스팅 WCF 서비스가

[OperationBehavior(Impersonation = ImpersonationOption.Required)] 
public List<GpoItem> GetAll() 
{ 
    using (ServiceSecurityContext.Current.WindowsIdentity.Impersonate()) 
    { 
     // Execute GPO code here... 
     return new List<GpoItem>(); 
    } 
} 

좀 더 컨텍스트를 추가하려면를, 기본적으로 내가 할 수있는 웹 서비스를 웹 페이지에 로그인 한 사용자가 도메인에서 GPO를 만듭니다. 콘솔에서 이것을 실행하면 도메인 사용자로 로그인 한 상태로 실행됩니다. Windows 서비스로 실행하면 "Access Denied"예외가 발생합니다. 따라서 가장 (impersonation)의 필요성. 위의 다음 변경된 코드를 넣으면 '작업 오류가 발생했습니다. (예외 HRESULT : 0x80072020) '. 인터넷 검색 결과 여전히 나에게 권한 문제가 있음을 보여줍니다. 필자는 웹 서비스 테스트 환경에 관리자로 로그인하여 전체 액세스 권한을 갖기 때문에 관리자로서 콘솔에서 실행할 수있는 것으로 나타났습니다. 나는 몇몇 깃발을 놓는 어떤 깃발을 놓치고있는 것처럼 느낀다.

아이디어가 있으십니까?

[Update1] 로컬 시스템에서 네트워크 서비스로 실행되는 서비스 전환 시도했지만 동일한 문제가 계속 발생합니다.

[업데이트 2] 로컬 시스템으로 실행되는 WCF 서비스를 호스팅하는 서버에 로그온하고 해당 컴퓨터에서 직접 브라우저를 사용하면 모든 것이 정상적으로 작동합니다. 그것은 여전히 ​​사용자 인증을 위임하는 문제로 보인다. 아직 알려지지 않았다.

+0

은'WindowsIdentity.Impersonate()'방법은 당신이 당신의'using' 블록에서 참조되지 않은'WindowsImpersonationContext' 값을 반환합니다. 이것을 참조하면 범위를 벗어나면 자동으로 WindowsImpersonationContext.Undo() 메소드가 호출됩니다. – Bernard

+0

WCF 서비스를 추적하여 예외가 throw되는 위치를 확인해 봤습니까? – Bernard

+0

내가 던진 예외는 'System.Runtime.InteropServices.COMException (0x80072020) : 작업 오류가 발생했습니다. (HRESULT 예외 : 0x80072020) ' – ymerej

답변

0

분명히 로컬 리소스 액세스에만 사용할 수있는 WCF 특성에서 가장 수준의 토큰을 얻을 수 있습니다. 대신 네트워크 리소스에 액세스 할 수있는 대리인 수준의 토큰을 얻을 수 있도록 LogonUser API를 사용해야했습니다. [1]

[1] http://msdn.microsoft.com/en-us/library/ff649252.aspx

관련 문제