0

我有一个受 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 执行此操作。不起作用!精氨酸!

有任何想法吗?

4

1 回答 1

0

您可以尝试配置消息日志记录,以检查实际发送的内容。

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

于 2009-09-01T16:12:42.823 回答