Secure Conversation으로 보호되는 WCF 서비스 (FooService)가 있습니다. 또한 FooService를 호출하는 클라이언트에 토큰을 제공하는 STS (StsService)가 있어야합니다. 토큰은 15 분 동안 훌륭합니다. STS는 맞춤 빌드 (제네바 없음)입니다. 또한 클라이언트에는 클라이언트 수명 기간 동안 여러 서비스에서 토큰을 다시 사용할 수있는 몇 가지 사용자 지정 WCF 확장이 있습니다.WCF STS 토큰 만료 문제
FooService에 대한 채널에서 "열기"가 호출되면 클라이언트가 STS에서 토큰을 요청합니다. STS는 정상적으로 작동하고 토큰을 발급하며 유효한 RSTR을 클라이언트에 제공합니다. 클라이언트는 비 직렬화 토큰을받습니다 (GenericXmlSecurityToken
개체로).
문제 :
클라이언트가 GenericXmlSecurityToken
인스턴스를 수신 만료 날짜가 올바르게 설정되지 않습니다. RSTR에는 유효한 만료 날짜를 가진 SAML 태그 <saml:Conditions>
이 있지만 어떤 이유로 WCF가 태그를 파싱하지 않고 NotOnOrAfter
값을 사용하고 있지 않습니다. 여기
<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!
아이디어가 있으십니까?
그래, 메시지 로깅을 구성했습니다. 이 메시지는 유효한 NotValidOnOrAfter 특성을 가진 유효한 요소를 포함합니다. 그것은 단지 클라이언트 측에서 무시되고 있습니다. –
Doanair
datetime의 형식과 관련이있을 수 있습니까? 내가 생각했던,하지만 난 수동으로 구문 분석을 시도하고 여기 는 클라이언트가 서버로부터 수신하는 것입니다 ... 잘 날짜 시간으로 구문 분석하는 것입니다 –
: ((GenericXmlSecurityToken) 토큰) .TokenXml.InnerXml = = saml : Conditions> –
Doanair