安全中间业务实现(intermediate service implementation with

2019-10-29 06:46发布

我有一个简单的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;
    }
}

现在我得到的错误是

多个头名为“安全”和命名空间“ http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd ”和角色'found`。

我打开WCF的诊断,并与从路由器发送与从客户端发送邮件的标题。 而事实上,路由器的消息有2个安全标头。

我假设最初是由客户端增加了一个(因为它不知道它现在的工作对一个路由器 - 它仍然认为这是实际的服务器),以及由路由器的第二个。

因此,从逻辑上讲,接下来要做的事情就是禁用我在第一次到路由器配置(简单地改变添加的安全security mode ,以None )。

而现在我得到的例外是

在“收件人”,“ http://www.w3.org/2005/08/addressing ”所需的消息部分没有签名

我假设这意味着我的路由器已经改变了信息的To现场,由于没有安全是configured-路由器没有签名...

所以我想我有点卡住。 目前,我正在考虑这两个选项是:

  1. 与消息的头不知怎的,篡改和删除冗余的安全头。
  2. 禁用客户端与路由器之间的安全性,只有路由器和服务之间具有安全性。

然而,这具有更改客户端,这是我不想做的缺点。

有任何想法吗?

文章来源: intermediate service implementation with security