0

在实验室环境中,我有三个“应用程序”:ABC

BC托管 WCF 聊天服务。A只是一个客户。

应用程序看到托管在B上的WCF 服务,而B看到托管在C上的 WCF 服务。所以A应用程序不能将消息直接发送到C

我使用带有消息安全性的 netTcpBinding,并使用 X509 证书进行保护。 一个应用程序知道BC的证书。

我想为B应用程序的聊天服务创建一个代理,并发送一条带有一些标记的消息,告诉B将消息路由到C应用程序。另外,我希望使用C证书对消息进行编码,因此B无法读取指定给C的消息。

这个问题可以通过许多可怕的方式来解决。我对 WCF 有点过期,所以我需要帮助来找到更好的解决方案。

你能提出更好的方法来解决这个问题吗?

谢谢!

4

1 回答 1

0

我还有其他问题。如何对消息正文进行编码?

在客户端,我使用此代码

NetTcpBinding binding = new NetTcpBinding { Security = { Mode = SecurityMode.Message } };
binding.Security.Message.ClientCredentialType = MessageCredentialType.Certificate;

//_foreignServiceCertificate - is the B certificate
//_foreignServiceUrl - is the url of the B service
var endpointIdentity =  EndpointIdentity.CreateDnsIdentity(_foreignServiceCertificate.SubjectName.GetCommonName());
var endPointAddress = new EndpointAddress(new Uri(_foreignServiceUrl), endpointIdentity);

//_thisPeerCertificate - is the A certificate
var channelFactory = new ChannelFactory<IChatService>(binding, endPointAddress);
channelFactory.Credentials.ClientCertificate.Certificate = _thisPeerCertificate;
channelFactory.Credentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.Custom;
channelFactory.Credentials.ServiceCertificate.Authentication.CustomCertificateValidator = new ClientCertificateValidation(_foreignServiceCertificate);
IChatService serviceProxy = channelFactory.CreateChannel();

var chatMessage = new ChatMessage { Message = message, MessageSender = _thisPeerCertificate };

serviceProxy.SendMessage(chatMessage);

您建议使用C公钥加密消息正文。并且消息正文将由 wcf 基础设施使用B公钥额外加密。我做对了吗?

是否正确,我可以使用 IEndPointBehavior 的自定义实现和 IClientMessageInspector 的自定义实现(方法 beforesendrequest)对消息​​体进行编码?

于 2013-11-01T15:07:18.283 回答