2014-02-18 3 views
1

일부 클라이언트는 기본 인증을 사용하여 WCF SOAP 서비스에 연결할 수 있어야하고 일부 클라이언트는 Windows 인증을 사용해야합니다. 덜 개발 된 Windows 서비스 호스팅 옵션을 제공하지만 일반적으로 IIS에서 서비스를 호스팅합니다.기본 및 Windows 인증 옵션을 사용하여 WCF 서비스를 노출하는 방법 협상이 작동합니다.

기본 인증과 Windows 인증을 모두 지원하도록 하나의 끝점을 구성 할 수 없다는 것을 이해합니다. 따라서 우리는 서비스 당 두 개의 끝점을 갖습니다.

<endpoint address="" binding="basicHttpBinding" bindingConfiguration="BasicBinding" contract="SomeContract" bindingNamespace="http://www.somewhere.com/Something" /> 
<endpoint address="win" binding="basicHttpBinding" bindingConfiguration="WindowsBinding" contract="SomeContract" bindingNamespace="http://www.somewhere.com/Something" /> 

... 

<bindings> 
    <basicHttpBinding> 
    <binding name="BasicBinding"> 
     <security mode="TransportCredentialOnly"> 
     <transport clientCredentialType="Basic"/> 
     <message clientCredentialType="UserName"/> 
     </security> 
    </binding> 
    <binding name="WindowsBinding"> 
     <security mode="TransportCredentialOnly"> 
     <transport clientCredentialType="Windows"/> 
     <message clientCredentialType="UserName"/> 
     </security> 
    </binding> 
    </basicHttpBinding> 
</bindings> 

이들은 IIS의 동일한 웹 응용 프로그램에 있습니다. 해당 웹 응용 프로그램은 기본 인증과 Windows 인증을 모두 사용할 수 있습니다. 그렇지 않으면 위 바인딩 중 하나가 작동하지 않습니다.

클라이언트가 Windows 인증 끝점 (URL 끝에 "win")을 사용하면 일반적으로 정상적으로 작동합니다. 초기 요청에 인증 정보가 포함되어 있지 않으면 클라이언트와 IIS간에 협상이 이루어지며 Windows 인증을 통해 협상이 이루어지며 모두 잘 처리됩니다.

클라이언트가 URL 끝 부분에 "win"이없는 기본 인증 된 끝점을 사용하는 경우 올바른 인코딩 된 자격 증명이 포함 된 인증 HTTP 헤더가 포함되어 있으면이 방법이 효과적입니다. 그러나 초기 요청에 인증 정보가 포함되어 있지 않으면 협상이 Windows 인증을 선택합니다. 이것은 IIS 보안을 지나서 요청을 가져 오지만 WCF는 요청을 거절합니다. 이는 기본 인증 된 끝점으로 이동하기 때문입니다.

나는 협상에서 무슨 일이 일어나고 있는지 정확히 알기 어렵습니다. 그러나 요청에 대한 특정 WCF 끝점 URL 만 기본을 지원하지만 IIS가 웹 응용 프로그램 (예 : 기본 및 Windows)에 대해 사용 가능한 모든 인증 방법을 제공하는 것으로 보입니다.

요청이 기본 인증 된 끝점 인 경우 기본 요청을 사용하는 경우 기본 응답을 사용하도록 협상을 진행하기 위해 IIS에서 수행 할 수있는 작업이 있는지 알고 싶습니다. 물론 요청이 Windows 인증 된 끝점으로 이동하면 Windows를 선택하는 협상을 계속하기를 원합니다.

그렇다면 Windows 서비스 호스팅 버전의 서비스에 집중하는 것이 더 좋을 것이라고 생각하십니까? 아니면 그 비슷한 문제가 어떻게 든 있겠습니까?

최종 메모 : 일부 내부 용으로는 기본 HTTP를 사용하지만 우리는 이것이 안전하지 않은 조합임을 알고 있습니다. 따라서 일반적으로 프로덕션 용도로 HTTPS를 사용합니다. 단순함을 위해서 나는 그것을 여기에두고 왔습니다.

+0

나는 약 을 찾았습니다. clientCredentialType = "InheritedFromHost" 이것은 .Net 4.5의 새로운 기능이며, 제 문제점을 해결하는 것 같습니다. 나는 그것이 모든 문제를 해결하는지 아직 확신하지 못하고있다. – PeteAC

답변

0

예, clientCredentialType = "InheritedFromHost"가 문제를 해결합니다. 닷넷 4.5의 새로운 기능은 이제 하나 이상의 인증 유형에 대해 동일한 엔드 포인트 URL을 사용할 수 있음을 의미합니다. IIS 설정은 허용되는 인증을 제어합니다. 즉 IIS와 WCF 설정을 충돌로 가져올 수 없게됩니다.