2009-09-01 2 views
0

Secure Conversation으로 보호되는 WCF 서비스 (FooService)가 있습니다. 또한 FooService를 호출하는 클라이언트에 토큰을 제공하는 STS (StsService)가 있어야합니다. 토큰은 15 분 동안 훌륭합니다. STS는 맞춤 빌드 (제네바 없음)입니다. 또한 클라이언트에는 클라이언트 수명 기간 동안 여러 서비스에서 토큰을 다시 사용할 수있는 몇 가지 사용자 지정 WCF 확장이 있습니다.WCF STS 토큰 만료 문제

FooService에 대한 채널에서 "열기"가 호출되면 클라이언트가 STS에서 토큰을 요청합니다. STS는 정상적으로 작동하고 토큰을 발급하며 유효한 RSTR을 클라이언트에 제공합니다. 클라이언트는 비 직렬화 토큰을받습니다 (GenericXmlSecurityToken 개체로).

문제 :

클라이언트가 GenericXmlSecurityToken 인스턴스를 수신 만료 날짜가 올바르게 설정되지 않습니다. RSTR에는 유효한 만료 날짜를 가진 SAML 태그 <saml:Conditions>이 있지만 어떤 이유로 WCF가 태그를 파싱하지 않고 NotOnOrAfter 값을 사용하고 있지 않습니다. 여기

이 (가) STS (서버 측)에 대한 구속력 : 나는 올바른 만료 날짜를 얻기 위해 여러 가지를 시도

<binding name="stsBinding" 
    closeTimeout="00:02:00" 
    openTimeout="00:02:00" 
    sendTimeout="00:02:00"> 
     <security authenticationMode="SecureConversation" requireSecurityContextCancellation="true"> 
     <localClientSettings maxClockSkew="23:59:59" /> 
     <localServiceSettings maxClockSkew="23:59:59" 
inactivityTimeout="00:02:00" /> 
     <secureConversationBootstrap 
authenticationMode="UserNameForSslNegotiated"> 
      <localClientSettings maxClockSkew="23:59:59" /> 
     <localServiceSettings maxClockSkew="23:59:59" /> 
    </secureConversationBootstrap> 
    </security> 
    <binaryMessageEncoding /> 
    <tcpTransport maxReceivedMessageSize="2097152" 
       maxBufferSize="2097152" maxPendingConnections="10" 
       listenBacklog="10" /> 
</binding> 

: 여기

<binding name="stsBinding" receiveTimeout="infinite" 
sendTimeout="infinite"> 
     <security authenticationMode="SecureConversation" requireSecurityContextCancellation="true"> 
     <localClientSettings maxClockSkew="23:59:59" /> 
     <localServiceSettings maxClockSkew="23:59:59" 
inactivityTimeout="00:02:00" /> 
     <secureConversationBootstrap 
authenticationMode="UserNameForSslNegotiated"> 
      <localClientSettings maxClockSkew="23:59:59" /> 
      <localServiceSettings maxClockSkew="23:59:59" /> 
     </secureConversationBootstrap> 
     </security> 
     <binaryMessageEncoding /> 

하는 바인딩 클라이언트 측입니다 보여주기 위해 ... 그러나 nothings는 일하는 것처럼 보인다. 사용자 지정 직렬화기를 구현하려고 시도했습니다. <saml:Conditions>의 흔적을 찾을 수 없습니다. 또한 STS를 직접 호출 한 다음 토큰을 다시 WCF에 제공했습니다. 이 솔루션은 STS를 직접 호출하고 응답을 유효한 SecurityToken으로 직렬화 해제했지만 WCF에 다시 제공되면 채널의 "열기"호출이 2 분 후에 타임 아웃됩니다. 오류 메시지가없고 추적 로그에 아무 것도 없습니다 ...

클라이언트 쪽에서는 토큰에 SAML 어설 션이 있습니다. 내가 보면 :

<saml:Conditions 
NotBefore="2009-09-01T19:36:54.669Z" 
NotOnOrAfter="2009-09-01T19:41:54.669Z" 
xmlns:saml="urn:oasis:names:tc:SAML:1.0:assertion"> 
</saml:Conditions> 

심지어는 .NET Framework 소스를 단계별로했지만, VS와 윈도우 7에서 2008 SP1이 작동하지 않는 것을 수행 할 수 없습니다 ((GenericXmlSecurityToken)token).TokenXml.InnerXml, 이것은 내가 볼 것입니다! Arg!

아이디어가 있으십니까?

답변

0

메시지 로깅을 구성하여 실제로 어떤 메시지가 전송되었는지 확인할 수 있습니다.

http://msdn.microsoft.com/en-us/library/ms730064.aspx

+0

그래, 메시지 로깅을 구성했습니다. 이 메시지는 유효한 NotValidOnOrAfter 특성을 가진 유효한 요소를 포함합니다. 그것은 단지 클라이언트 측에서 무시되고 있습니다. – Doanair

+0

datetime의 형식과 관련이있을 수 있습니까? 내가 생각했던,하지만 난 수동으로 구문 분석을 시도하고 여기 는 클라이언트가 서버로부터 수신하는 것입니다 ... 잘 날짜 시간으로 구문 분석하는 것입니다 –

+0

: ((GenericXmlSecurityToken) 토큰) .TokenXml.InnerXml = = Doanair