识别 WCF 客户端 ID

Posted

技术标签:

【中文标题】识别 WCF 客户端 ID【英文标题】:Identifying WCF Client ID 【发布时间】:2011-03-17 16:13:33 【问题描述】:

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

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

我的 WCF 服务是否能够识别连接到它的客户端?还有没有办法使用签名密钥来防止客户欺骗他们的身份?

【问题讨论】:

您是否有此类操作的示例场景,该场景应根据调用者的不同而有所不同?您可能需要考虑仅应用身份验证和授权,而不是根据调用者的不同进行行为不同的操作。 是的...我们有几个场景需要在后端进行不同的处理,具体取决于正在连接的 WCF 客户端。 【参考方案1】:

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

您可以在客户端应用程序的配置文件中添加自定义标头作为端点的一部分。然后,您将使每个客户端的自定义标头不同。例如,在 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
   
      // ...
   

【讨论】:

【参考方案2】:

为了识别调用者的类型(ASP.NET 与 WInforms 或其他),您可能需要在 WCF 消息中添加自定义标头 - 服务无法知道调用客户端的任何信息,除非它是其中的一部分发送的消息或标头。为此,最好的办法是编写一个 WCF 消息检查器 - 这个blog post here 将向您展示如何做到这一点。

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

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

【讨论】:

Message Inspector 是否与安德鲁的答案一一对应;只是做同样事情的不同方式?还是使用 Inspector 有什么价值?

以上是关于识别 WCF 客户端 ID的主要内容,如果未能解决你的问题,请参考以下文章