识别WCF客户端ID

时间:2010-07-18 21:06:16

标签: c# wcf wcf-security

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

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

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

2 个答案:

答案 0 :(得分:15)

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

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

答案 1 :(得分:3)

为了识别调用者的类型(ASP.NET与WInforms或其他),你可能需要为你的WCF消息添加一个自定义标题 - 除非它是一部分,否则服务无法知道任何关于调用客户端的信息消息或发送的标题。为此,最好的办法是编写WCF消息检查器 - 这个blog post here将告诉您如何执行此操作。

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

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