2010-06-25 14 views
2

의 소비자가 내 WCF 서비스에 제 3 자 (통제)에 의해 발표 된 WCF 서비스 (서비스 및 A)를 소비 할 필요가 업그레이드되고있다. 내 웹 응용 프로그램 프로젝트 (vs2008)에 ServiceA을 사용하고 있으며 정상적으로 작동합니다.WCF 서비스 프로젝트에서 다른 WCF 서비스

내 WCF 프로젝트 (서비스 B)에 서비스 참조 추가로 시작했습니다. 서비스 이름이 "XYZ"라고 말할 수 있습니다. VS 필요한 모든 파일을 만들었지 만 컴파일하려고하면 오류가 발생했습니다.

'XYZ'형식이 'ServiceB.ServiceB'형식에 없습니다.

내 '서비스 B는'가 'ServiceB.SVC'나는 네임 스페이스를 제거하여이 문제를 극복하기 위해 노력

"ServiceB." Reference.cs 파일 및 그 내용. 이 코드는 컴파일 될 수 있습니다.

는 지금은

"호출자가 서비스에 의해 인증되지 않았습니다."라는 예외를 얻을

인증을 실패하여 보안 토큰에 대한 요청이 만족하지 않는

내부 예외입니다.

System.ServiceModel.Security.SspiNegotiationTokenProvider.GetNextOutgoingMessageBody (메시지 incomingMessage, SspiNegotiationTokenProviderState sspiState)

=>

(AT System.ServiceModel.Security.SecurityUtils.ThrowIfNegotiationFault (메시지 메시지 EndpointAddress를 대상)에서

(System.ServiceModel.FaultException) (ex.InnerException)) 메시지 인증에 실패 했으므로 보안 토큰 요청을 만족시킬 수 없습니다.

은 다음 ServiceB에 의 Web.config 파일이 같이

<wsHttpBinding> 
     <binding name="WSHttpBinding_IABCService" closeTimeout="00:01:00" 
      openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" 
      bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard" 
      maxBufferPoolSize="524288" maxReceivedMessageSize="65536" messageEncoding="Text" 
      textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false"> 
      <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" 
      maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
      <reliableSession ordered="true" inactivityTimeout="00:10:00" 
      enabled="false" /> 
      <security mode="Message"> 
      <transport clientCredentialType="Windows" proxyCredentialType="None" 
       realm="" /> 
      <message clientCredentialType="Windows" negotiateServiceCredential="true" 
       algorithmSuite="Default" establishSecurityContext="true" /> 
      </security> 
     </binding> 
     </wsHttpBinding> 
    </bindings> 
    <client> 
     <endpoint address="http://aaaaa/ ServiceA.svc" 
     binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IABCService" 
     contract="XYZ.IABCService" name="WSHttpBinding_IABCService"> 
     <identity> 
      <servicePrincipalName value="host/[hostname]" /> 
     </identity> 
     </endpoint> 
    </client> 

======

내가 내 자신을 만들어

그 문제는 WCF는 WCF 접근에있을 수 있습니다 생각 . 웹 서비스 (.asmx)를 만들고 ServiceA에 대한 참조를 추가했습니다. 메소드를 호출하여 디버깅 할 때 ServiceA에서 결과를 얻습니다. 이것이 WCF와 WCF 문제 사이에서 파악할 때까지 사용할 수있는 해결책이었습니다. 저는 asmx 서비스에 대한 참조를 My WCF Service (ServiceB)에 추가했습니다. ServiceB 실행 -> asmx -> 서비스 A로 디버깅 할 때 사용자 오류로 인해 인증이 다시 실패합니다 !!!

나는 그것이 신원이 도용되고 함께 할 수있는 뭔가가 생각

... 난 ServiceB의 web.config는 ASMX web.config를 통해 우선 순위를 가지고 있음을 읽을 수 있지만 나는 해결책을 얻을 수 없습니다.

"보안 모드 = 없음"을 해제 할 수 없으므로 서비스 A는 토큰이 전달되지 않았다는 응답을 표시합니다.

어떤 도움을 받으실 수 있습니다 : WebApp 및 asmx에서 WC 서비스 A를 사용할 수 있지만 다른 WCF에서는 직접 또는 간접적으로 사용할 수 없습니다.

당신에게

답변

0

감사 그것은 당신이 가장 대신 위임을 가질 필요가 나에게 보인다. 현재 사용자가 당신이 DuplicateTokenDuplicateTokenExSecurityDelegation SecurityImpersonation (SECURITY_IMPERSONATION_LEVEL) 다음 WindowsIdentity(IntPtr) 생성자 (마지막 하나는 TokenPrimary를 생성 할 수 있습니다) 사용할 수있는 또 다른 하나에 토큰으로 변환합니다. 예를 들어 LogonUser and delegation을 참조하십시오.

또 다른 방법은 프로토콜 전환 : S4U, S4U2Self (http://msdn.microsoft.com/en-us/magazine/cc163500.aspx, http://msdn.microsoft.com/en-us/library/ff650469.aspx, http://msdn.microsoft.com/en-us/library/ms998355.aspx 참조)입니다. new WindowsIdentity(clientUPN).Impersonate()과 같은 것을 사용할 수 있습니다.

+0

이 링크를 확인해 보겠습니다. – TheMar

+0

http://stackoverflow.com/questions/9584198/authentication-service-using-wcf에 응답 해주십시오. – Lijo

2

WCF를 호출하는 WCF와는 아무런 관련이 없습니다. WCF를 호출하는 WCF가 컴파일 오류를 일으킨다 고 상상해보십시오. 2006 년 이래로 세계에서 가장 먼저 발견 한 사람입니다.

전체 네임 스페이스를 철자로하여 "XYZ"유형의 정규화를 시도하십시오. 그래도 작동하지 않으면 각 서비스 참조를 마우스 오른쪽 단추로 클릭하고 "개체 브라우저에서보기"를 선택하십시오. 유형의 전체 이름이 무엇인지 확인하십시오.

아무 것도 도움이되지 않으면 완전한 오류 메시지 및/또는 예외를 게시하십시오.

그리고 편집 참조 .cs. 다음 번에 "서비스 참조 업데이트"가 수행 될 때 편집 내용이 모두 파괴됩니다. 따라서 Reference.cs에 대해 변경하려는 변경 사항은 변경하지 않고 더 나은 방법으로 수행 할 수 있습니다. 그렇지 않으면 실제로 이 변경하지 않았 으면합니다.

+0

Reference.cs를 변경하지 말 것을 제안 해 주셔서 감사합니다. 내가 개체 브라우저에서 서비스 참조를 보았고 모두 괜찮아 보인다. 비슷한 문제를 겪고있는 다른 사람들 (인터넷 검색)에 대한 것 같습니다. 솔루션을 찾을 수 있는지 알아보기 위해 일부 문제를 조사 중입니다. 나는 완전한 자격을 갖춘 이름으로 시도했지만 그게 도움이되지 못했습니다. 내 사무실 시스템에 연결할 수있게되면 곧 내가 찾은 것을 업데이트 할 것입니다. – TheMar

0

대리인을 수행해야하는 경우 (즉, 원래 발신자 역할을하는) 프로세스는 this MSDN Forum thread에 자세히 설명되어 있습니다. 완전 신뢰 위임을 사용하지 마십시오. AD에 대한 관리자 권한이 필요하며 이는 보안 전문가에게 좋은 것은 아닙니다. 제한된 위임은 SETSPN 명령에서 사용할 이름을 아는 경우 올바르게 설정하기 쉽습니다. 또한 도메인 사용자 계정을 사용하여 서비스 B (위임자)를 실행했는지, 네트워크 서비스/로컬 서비스 또는 로컬 사용자 계정과 같은 컴퓨터 계정이 작동하지 않는 경우 SPN을 만들 수 없으므로 작동하지 않도록하십시오.

+0

http://stackoverflow.com/questions/9584198/authentication-service-using-wcf에 응답 해주십시오. – Lijo