WIFを使用してストリーミングされたWCF net.tcpサービスエンドポイントを保護する必要があります。トークンサーバーに対して着信呼び出しを認証する必要があります。このサービスは、大量のデータを転送するように設計されているため、ストリーミングされます。
これは不可能のようです。 そして、もし私が捕まえられない場合、私のクリスマスは台無しになり、陽気な買い物客がゆっくりと冷えている体の上を歩き回る間、私は雨どいの中で自分を飲み殺してしまいます。トート深刻です、皆さん。
なぜこれが不可能なのですか?これがCatch-22です。
クライアントでは、トークンサーバーから取得したGenericXmlSecurityTokenを使用してチャネルを作成する必要があります。問題ありません。
// people around here hate the Framework Design Guidelines.
var token = Authentication.Current._Token;
var service = base.ChannelFactory.CreateChannelWithIssuedToken(token);
return service.Derp();
「問題ありません」と言いましたか?問題。実際には、NullReferenceException
スタイルの問題。
「ブロ、」私はフレームワークに尋ねました、「ヌルチェックすらしますか?」フレームワークはサイレントだったので、分解してみた
((IChannel)(object)tChannel).
GetProperty<ChannelParameterCollection>().
Add(federatedClientCredentialsParameter);
例外の原因であり、GetProperty
呼び出しが返されていたnull
。それで、WTF?メッセージセキュリティをオンにして、クライアントの資格情報の種類をに設定するとIssuedToken
、このプロパティがに存在することがClientFactory
わかります(ヒント:IChannelには同等の "SetProperty"はありません)。
<binding name="OMGWTFLOL22" transferMode="Streamed" >
<security mode="Message">
<message clientCredentialType="IssuedToken"/>
</security>
</binding>
甘い。NREはもうありません。しかし、今私のクライアントは出生時に失敗しています(まだ彼を愛しています、tho)。WCF診断を掘り下げて(ヒント:最悪の敵を粉砕し、運転する前に運転して、女性と子供の悲嘆を楽しむ直前に)、サーバーとクライアント間のセキュリティの不一致が原因であると思います。
要求されたアップグレードは 'net.tcp:// localhost:49627 / MyService'ではサポートされていません。これは、バインディングの不一致が原因である可能性があります(たとえば、サーバーではなくクライアントでセキュリティが有効になっている)。
ホストの診断をチェックします(ここでも、クラッシュ、ドライブ、ログの読み取り、嘆きをお楽しみください)。これは本当です。
プロトコルタイプapplication / ssl-tlsは、そのタイプのアップグレードをサポートしないサービスに送信されました。
「まあ、私は」と私は言います。「ホストでメッセージセキュリティをオンにします!」そして私はそうします。 それがどのように見えるかを知りたい場合は、クライアント構成の正確なコピーです。調べる。
結果: カブーム。
バインディング( 'NetTcpBinding'、 ' http://tempuri.org/ ')は、メッセージレベルのセキュリティと一緒に構成できないストリーミングをサポートしています。別の転送モードを選択するか、トランスポートレベルのセキュリティを選択することを検討してください。
そのため、私のホストはトークンを介してストリーミングと保護の両方を行うことはできません。キャッチ-22。
tl; dr:WIFを使用して、ストリーミングされたnet.tcp WCFエンドポイントをどのように保護できますか?
TransportWithMessageCredential
モードは別のオプションであるかもしれません。
<security mode="Transport" /> <transport clientCredentialType="IssuedToken" /> </security>