私はSecure Conversationによって保護されたWCFサービス(FooService)を持っています。また、FooServiceを呼び出すクライアントにトークンを提供するSTS(StsService)もあります。トークンは15分間良好です。 STSはカスタムビルドです(ジュネーブはありません)。また、クライアントには、クライアントのライフタイム中に複数のサービスでトークンを再利用できるカスタムWCF拡張機能もあります。WCF STSトークンの有効期限問題
クライアントは、FooServiceへの "Open"が呼び出されたときに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>
私は、正しい有効期限を取得するにはいくつかのことを試してみましたショーアップする...しかし、nothingsが動作するようです。カスタムのシリアライザを実装しようとしました。 <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のソースをステップが、VS 2008でWindows 7のSP1が動作しないことを行うことはできませんみました! Arg!
アイデア?
ええ、私はメッセージロギングを設定しました。このメッセージには、有効なNotValidOnOrAfter属性を持つ有効な要素が含まれています。それは単にクライアント側で無視されています。 –
Doanair
日時の形式と関係がありますか?私は思ったが、私は手動でそれを解析しようと、それはここで は、クライアントがサーバから受信したものです...ちゃんとのDateTimeに解析するものです –
: ((GenericXmlSecurityToken)トークン).TokenXml.InnerXml = = saml:Conditions> –
Doanair