2014-10-21 3 views
0

동일한 인트라넷 전용 상자에 두 번째 IIS 호스팅 WCF 서비스를 호출하는 IIS 8 호스트 웹 사이트가 있습니다. (비활성화 다른 모든) 두 응용 프로그램 FQDN과 함께 사용하면 WCF TransportCredentialOnly 보안이 깨집니다.

  • 웹 사이트 도메인 서비스 계정에서 호스팅되는 사용할 수

    • Windows 인증.
    • IIS AppPool 사용자가 호스팅하는 WCF 서비스 사이트. 이 같은

    바인딩 외모 :

    <binding name="BasicHttpBinding_ServiceName" sendTimeout="00:05:00"> 
        <security mode="TransportCredentialOnly"> 
         <transport clientCredentialType="Windows" /> 
        </security> 
    </binding> 
    

    웹 사이트는 모든 것이 잘 작동 주소의 NetBIOS 또는 IP를 사용하여 서비스에 액세스합니다. 그러나 이제 프로덕션 환경 (http://services.company.localhttp://web.company.local)에 대해 FQDN을 사용하려고합니다. 즉시 나는 FQDN을 통해 WCF 서비스를 호출하려고 할 때, 나는 다음과 같은 예외 메시지와 함께 uauthorized 401가 나타납니다

    MessageSecurityException를 : HTTP 요청은 '협상'클라이언트 인증 방식으로 인증되지 않은 것입니다. 서버에서 수신 한 인증 헤더는 '협상, NTLM'입니다.

    내가 NTLM에 clientCredentialType을 변경없이 성공 (같은 오류 메시지와 함께 (다른 SO 질문에 제안대로)가 IIS 인증에서 제공 협상을 제거하려고했습니다, 서버에서받은 단지 헤더는 NTLM '이었다 "대신"Negotiate, NTLM "을 사용합니다. 다른 연구 결과에 따르면이 사이트 용으로 만든 두 하위 도메인과 관련된 SPN의 문제 일 수 있지만 확실하지 않습니다. 1. 이러한 도메인에 대한 SPN 확인 방법, 2. SPN이 무엇이되어야하는지, 3. 커널 모드 인증을 사용하고있는 것을 고려할 때 여전히 관련이 있다면

  • 답변

    0

    문제는 SPN이 누락 된 것으로 판명되었습니다. 커널 모드를 사용하여 관련성이있다. 유일한 차이점은 AppPool이 실행되는 계정에 더 이상 묶이지 않아도되지만 대신 컴퓨터 계정에만 연결된다는 것입니다.

    나중에 참조 할 수 있도록이 SPN Checklist for Kerberos Authentication with IIS 7.0/7.5은 모든 것을 처음 구성 할 때 매우 유용합니다. 특히 사용자 지정 호스트 이름이있는 사이트에 액세스하려면 추가 SPN을 만들어야합니다. 예를 들어, 서버에서 호스팅 사이트에 대해 회사가-IIS-1 http://services.company.local를 통해 액세스되는 이름, 다음 명령은 해당 SPN을 만들기 위해 실행해야합니다 :

    setspn -s http/services.company.local COMPANY-IIS-1 
    

    (-s 대신 -a의 사용에 의해 제안 최초로 확인 이후 링크 된 기사는 좀 더 도전이었다) 문제를 디버깅


    확인 SPN이 이미 존재하지 않는 확인하고 웹 서버 상자에 설치 WireShark로의 사용을 요구합니다. 패킷 추적을 시작한 다음 승인되지 않은 초기 오류가 수신 된 웹 페이지에 액세스하려고 시도했습니다. 그런 다음 kerberos 트래픽에 대해서만 패킷 캡처를 필터링했습니다.

    거기에서 kerberos TGS-REQ와 결과 오류를 볼 수 있었는데, 이것은 S_PRINCIPAL_UNKNOWN 오류로 판명되었습니다.이 응답의 세부 정보를 보면 인증에 성공하기 위해 위에 설명 된대로 생성해야하는 SPN 인 사용중인 SPN (아래에서 빨간색으로 설명)을 볼 수있었습니다.

    문제를 해결하기위한 단계별 절차는 this article이 매우 유용합니다.


    S_PRINCIPAL_UNKNOWN response in a WireShark packet capture

    가 마지막으로, 주어진 시스템과 관련된 모든 SPN을 보려면 다음 명령을 실행할 수 있습니다

    setspn -l [machine name] 
    

    예를 들어,

    setspn -l COMPANY-IIS-1