我有一个受Secure Conversation保护的WCF服务(FooService)。还有一个STS(StsService),它为调用FooService的客户端提供令牌。令牌好15分钟。 STS是定制的(没有日内瓦)。客户端还具有一些自定义WCF扩展,以允许在客户端的生命周期内跨多个服务重用令牌。
当调用FooService的通道上的“Open”时,客户端从STS请求令牌。 STS工作正常,发出令牌并向客户端提供有效的RSTR。客户端接收反序列化的令牌(作为GenericXmlSecurityToken
对象)。
问题:
当客户端收到GenericXmlSecurityToken
实例时,未正确设置到期日期。在RSTR中,有一个SAML标记<saml:Conditions>
具有有效的到期日期BUT,由于某种原因,WCF似乎没有解析标记并使用NotOnOrAfter
的值。
这是STS(服务器端)的绑定:
<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 />
这是客户端绑定:
<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>
我已经尝试了几件事来获得正确的到期日期......但是没有什么可行的。尝试实现自定义序列化程序。找不到<saml:Conditions>
的任何痕迹。还尝试直接调用STS,然后将令牌提供给WCF。该解决方案有效,直接调用STS并将响应反序列化为有效的SecurityToken,但是当它被提供回WCF时,通道上的“Open”调用在2分钟后超时。没有错误消息,跟踪日志中没有任何内容...
在客户端,令牌具有SAML断言。如果我看一下:((GenericXmlSecurityToken)token).TokenXml.InnerXml
,这就是我所看到的:
<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源代码,但在Windows 7上使用VS 2008 SP1无法做到这一点。不行!精氨酸!
有什么想法吗?