クライアントがサーバーのWCFサービスを参照する単純なWCFクライアント->サーバー構造があります。認証は X509 証明書を使用して行われます。
サービスに単純な形式の冗長性を追加したいと考えています。意味-複数のサーバーを実行し、メインサーバーが停止した場合にバックアップサーバーに透過的にフェイルオーバーするルーターをクライアントに使用させる.
私は WCF 4.0 ルーティングを見てきましたが、それは良くありませんでした。
だからあとは自分でやるしかない。まさにそれを行う良い例を見つけました。
ただし、作成者はセキュリティをまったく使用していません。
ルーターのバインディング構成に以下を追加して、メッセージレベルのセキュリティを追加しようとしました<client>
(既存のクライアントの構成からコピーしました)。
<security mode="Message">
<transport clientCredentialType="Windows" proxyCredentialType="None" realm="" />
<message clientCredentialType="Certificate" negotiateServiceCredential="false"
algorithmSuite="Default" establishSecurityContext="false" />
</security>
これを使用して、私は
クライアント証明書は提供されません。ClientCredentials にクライアント証明書を指定します。
私のサーバーからの例外。
そこで、ルーターのコードで作成したチャネルに証明書を手動で追加しました (完全なリストはこちら)。
[ServiceContract(Name = "IntermediateServiceManager")]
public interface IIntermediateServiceContract
{
[OperationContract(Name = "ProcessMessage", Action = "*", ReplyAction = "*")]
Message ProcessMessage(Message message);
}
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, AddressFilterMode = AddressFilterMode.Any)]
public class IntermediateServiceManager : IIntermediateServiceContract
{
public Message ProcessMessage(Message requestMessage)
{
ChannelFactory<IIntermediateServiceContract> factory = new ChannelFactory<IIntermediateServiceContract>("MyEndpoint");
factory.Credentials.ClientCertificate.SetCertificate(StoreLocation.LocalMachine,StoreName.My,X509FindType.FindBySubjectName,"mycert.company.com");
IIntermediateServiceContract proxy = factory.CreateChannel();
IClientChannel clientChannel = proxy as IClientChannel;
Message responseMessage = proxy.ProcessMessage(requestMessage);
return responseMessage;
}
}
そして今、私が得るエラーは
名前が「Security」、名前空間が「http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd」、役割が「見つかりました」のヘッダーが複数あります。
WCF 診断を有効にし、ルーターから送信されたメッセージのヘッダーとクライアントから送信されたヘッダーを比較しました。実際、ルーター メッセージには 2 つのセキュリティ ヘッダーがあります。
1つは最初にクライアントによって追加されたものであり(ルーターに対して現在機能していることを認識していないため、これが実際のサーバーであるとまだ考えているため)、2つ目はルーターによって追加されたと想定しています。
したがって、論理的には、次にすべきことは、最初にルーター構成に追加したセキュリティを無効にすることです (単純に に変更security mode
しましたNone
)。
そして今、私が得る例外は
'To', ' http://www.w3.org/2005/08/addressing ' 必須のメッセージ部分が署名されていませんでした
To
これは、ルーターがメッセージのフィールドを変更し、セキュリティが構成されていないため、ルーターが署名しなかったこと を意味すると想定しています...
だから私はちょっと立ち往生していると思います。私が現在検討している2つのオプションは次のとおりです。
- 何らかの方法でメッセージのヘッダーを改ざんし、冗長なセキュリティ ヘッダーを削除します。
- クライアントとルーター間のセキュリティを無効にし、ルーターとサービス間のセキュリティのみを確保します。
ただし、これにはクライアントを変更しなければならないという欠点があり、私はそうしたくありません。
何か案は?