2010-07-18 148 views
7

我有一个WCF Web服务公开了几种业务方法。我也有两个客户端 - 一个asp.net GUI和一个数据迁移应用程序,它们都连接到wcf后端以调用各种业务事务。识别WCF客户端ID

我需要我的后端能够识别和区分哪个wcf客户端调用了某种变体逻辑。

有没有一种方法可以让我的WCF服务识别连接到它的客户端?还有一种方法可以使用签名密钥来防止客户欺骗他们的身份吗?

+0

你有这样的操作的示例场景,应该表现不同,这取决于呼叫者,召集者?您可能需要考虑仅应用身份验证和授权,而不是根据调用者具有不同行为的操作。 – Alex 2010-07-20 07:21:55

+0

是的......我们有几个场景需要在后端以不同方式处理,具体取决于哪个WCF客户端正在连接。 – Hady 2010-07-23 03:33:53

回答

14

您可以通过自定义标题解决此问题。

您可以在客户端应用程序的配置文件中添加自定义标头作为端点的一部分。然后你会让每个客户的自定义标题不同。例如,在ASP.NET版本:

 <endpoint 
      name="basicHttpEndpoint" 
      address="http://localhost:8972" 
      binding="basicHttpBinding" 
      contract="MySeriveContractLib.IMyService" 
      > 
      <headers> 
       <ClientIdentification>ASP_Client</ClientIdentification> 
      </headers> 
     </endpoint> 

然后,服务可以检查像这样的头值:

public void MyServiceMethod() 
{ 
    var opContext = OperationContext.Current; 
    var requestContext = opContext.RequestContext; 
    var headers = requestContext.RequestMessage.Headers; 
    int headerIndex = headers.FindHeader("ClientIdentification", ""); 
    var clientString = headers.GetHeader<string>(headerIndex); 
    if clientString=="ASP_Client" 
    { 
     // ... 
    } 
    else 
    { 
     // ... 
    } 
} 
3

为了确定调用者的类型(ASP.NET与WInforms或其他),您可能需要为您的WCF消息添加自定义标头 - 服务无法知道调用客户端的任何内容,除非它是部分消息或标题发送。为此,最好的办法是编写一个WCF Message Inspector - 这个blog post here将告诉你如何做到这一点。

至于安全性 - 取决于您的环境。在防火墙后面的公司LAN中 - 使用Windows凭证。如果你“面对外”,最好的办法是在客户端安装数字证书来验证他们的身份。

WCF Guru JuvalLöwy在MSDN杂志Declarative WCF Security上有一篇非常好的文章,它描述了WCF中的五个常见安全方案以及如何实现它们。强烈推荐阅读。

+0

'消息检查员'是一对一的等同于安德鲁的答案;简单地做一个不同的方式做同样的事情?或者使用Inspector有价值吗? – OmegaMan 2014-04-01 14:39:00