在实验室环境中,我有三个“应用程序”: A , B , C 。
B 和 C 托管WCF聊天服务。 A 只是一个客户。
应用程序看到 B 上托管的WCF服务, B 看到 C 上托管的WCF服务。 因此 A 应用程序无法将邮件直接发送到 C 。
我使用带有Message安全性的netTcpBinding,并使用X509证书进行保护。 应用知道 B 和 C 的证书。
我想为 B 应用的聊天服务创建一个代理,然后发送一条带有一些标记的消息,告诉 B 将消息路由到 C 应用另外,我希望使用 C 证书对邮件进行编码,因此 B 无法读取指定给 C 的邮件。
问题可以通过许多可怕的方式解决。我对WCF有点过期,所以我需要帮助才能找到更好的解决方案。
你能建议更好的方法来解决这个问题吗?
谢谢!
答案 0 :(得分: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方法)对邮件正文进行编码?