我有一个受 Secure Conversation 保护的 WCF 服务 (FooService)。还有一个 STS (StsService),它为调用 FooService 的客户端提供令牌。代币有效期为 15 分钟。STS 是定制的(没有日内瓦)。客户端还具有一些自定义 WCF 扩展,以允许在客户端的生命周期内跨多个服务重用令牌。
当调用 FooService 通道上的“打开”时,客户端从 STS 请求令牌。STS 工作正常,发出令牌并向客户端提供有效的 RSTR。客户端接收反序列化的令牌(作为GenericXmlSecurityToken
对象)。
问题:
当客户端收到GenericXmlSecurityToken
实例时,到期日期设置不正确。在 RSTR 中,有一个 SAML 标记<saml:Conditions>
具有有效的到期日期,但由于某种原因,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 时,通道上的“打开”调用在 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 执行此操作。不起作用!精氨酸!
有任何想法吗?