WCF STS令牌到期问题

时间:2009-09-01 15:58:38

标签: c# wcf web-services sts-securitytokenservice

我有一个受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无法做到这一点。不行!精氨酸!

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

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

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