2009-09-01 111 views
0

我有一个由Secure Conversation保护的WCF服务(FooService)。还有一个STS(StsService),它为向客户端调用FooService提供令牌。令牌有15分钟的好处。 STS是定制的(没有日内瓦)。客户端还有一些自定义的WCF扩展,允许在客户端生命周期内跨多个服务重用令牌。WCF STS令牌过期问题

当调用通道上的“打开”到FooService时,客户端向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时,信道上的“打开”呼叫在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源步进,但不能做到这一点与VS在Windows 7 2008 SP1不起作用!精氨酸!

任何想法?

回答

0

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

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

+0

是的,我配置了消息记录。该消息包含具有有效NotValidOnOrAfter属性的有效元素。它只是在客户端被忽略。 – Doanair 2009-09-01 17:10:26

+0

这可能是与日期时间格式有关吗? – 2009-09-01 19:24:42

+0

这就是我想,但我尝试手动分析它并将其解析为日期时间就好了...... 下面是客户端从服务器接收: ((GenericXmlSecurityToken)令牌).TokenXml.InnerXml = = Doanair 2009-09-01 19:40:05