2011-09-01 4 views
7

나는 WCF 웹 서비스를 호출하는 멍청한 사람이다. 그래서 이것이 쉬운 질문이되기를 바란다. .NET 4 winform 클라이언트로 웹 서비스를 호출 할 때 인증 스키마를 Anonymous에서 NTLM으로 어떻게 변경합니까?NTLM 인증 스키마를 사용하여 웹 서비스를 호출하는 방법은 무엇입니까?

지금 예외가 발생합니다 : HTTP 요청이 '익명'클라이언트 인증 구성표와 함께 인증되지 않았습니다. 서버에서받은 인증 헤더는 'NTLM'입니다.

내 목표는 TFS 2010의 데이터웨어 하우스 및 큐브를 모니터링하는 데 도움이되는 작은 도구를 만드는 것입니다. TFS는 WarehouseControlWebService 웹 서비스를 제공합니다. 서버에 로그온 할 때 브라우저에서 테스트 모드를 통해 서비스를 호출 할 수 있습니다. 그러나 내 데스크톱에서 동일한 웹 서비스를 원격으로 호출하려고합니다. 내 사용자 계정이 서버의 로컬 관리자 그룹에 있습니다.

표준 Button1 및 TextArea1을 사용하여 .NET 4 WinForm을 만들었습니다. I는 웹 서비스에 대한 서비스 참조를 추가하고 창조적 ServiceReference1라고 불렀다 :

Add Service Reference... 
http://tfssvr:8080/tfs/TeamFoundation/Administration/v3.0/WarehouseControlService.asmx 

그리고 여기 내 코드 뒤에 :

private void button1_Click(object sender, EventArgs e) 
{ 
    // Creating a proxy takes about 3-4 seconds 
    var dwSvc = new ServiceReference1.WarehouseControlWebServiceSoapClient(); 

    // Invoking the method throws an MessageSecurityException 
    var dwStatus = dwSvc.GetProcessingStatus(null, null, null); 
} 

내가 System.ServiceModel.Security.MessageSecurityException 받고 있어요 :

클라이언트 인증 스키마 '익명'으로 인해 HTTP 요청이 허가되지 않았습니다. 서버에서받은 인증 헤더는 'NTLM'입니다.

내가 통해 내 자격 증명을 전달하는 시도 한 다음 WCF 문서를 통해서도

dwSvc.ClientCredentials.Windows.ClientCredential = 
    new System.Net.NetworkCredential("user", "pass", "domain"); 

및 ...

dwSvc.ClientCredentials.Windows.ClientCredential = 
    CredentialCache.DefaultNetworkCredentials; 

내가 넘어 가고있어하지만 ... 소년 아 ... 거기 거기에 많이. 나는 이것이 쉬운 무엇인가 희망하고있다?

미리 감사드립니다.

+0

참조하십시오 http://meta.stackexchange.com/questions/2950/should-hi-thanks -taglines-and-salutations-from-from-posts from –

답변

6

이 보안 모드 = "TransportCredentialOnly"및 전송 clientCredentialType로 설정 바인딩 설정 = "Ntlm입니다"

<system.serviceModel> 
    <bindings> 
     <basicHttpBinding> 
      <binding name="WarehouseControlWebServiceSoap" closeTimeout="00:01:00" 
       openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" 
       allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" 
       maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536" 
       messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" 
       useDefaultWebProxy="true"> 
       <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" 
        maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
       <security mode="TransportCredentialOnly"> 
        <transport clientCredentialType="Ntlm" proxyCredentialType="None" 
         realm="" /> 
        <message clientCredentialType="UserName" algorithmSuite="Default" /> 
       </security> 
      </binding> 
     </basicHttpBinding> 
    </bindings> 
    <client> 
     <endpoint address="http://tfsServer:8080/tfs/TeamFoundation/Administration/v3.0/WarehouseControlService.asmx" 
      binding="basicHttpBinding" bindingConfiguration="WarehouseControlWebServiceSoap" 
      contract="TfsWarehouse.WarehouseControlWebServiceSoap" name="WarehouseControlWebServiceSoap" /> 
    </client> 
</system.serviceModel> 
+0

이 구성을 사용하려고 시도했지만 https를 통해서만 서버에 액세스 할 수 있으므로'wsHttpBinding' 및'TransportWithMessageCredential'으로 교체했습니다. " '익명입니다. 서버로부터받은 인증 헤더가'NTLM '입니다." "오류가 발생했습니다. 'wsHttpBinding'과 함께 작동시키는 방법에 대한 제안이 있습니까? –

+0

Visual Studio 2010에서이 기능을 사용할 수 있습니다. 새 버전의 Visual Studio에서 오류가 발생하여 다른 사항이 있습니다. 그들은 다른 설정 파일을 생성합니다. –

0

올바른 방향으로 찾고 있습니다. 사용 가능한 인증 방법에 대한 몇 가지 예제 레벨 정보가있는 좋은 페이지입니다 : http://man.ddvip.com/web/bsaspnetapp/LiB0087.html. 그 페이지는 적어도 당신의 노력을 계속할 수있는 더 많은 단서를 제공해야합니다.

관련 문제