如果我正在托管一个WCF服务,以便有人(即我认识的人)可以使用我的服务,但如果其他人(即我不认识的人)消费它会怎么样呢?我如何防止这种情况?如何实现这一目标?
是否可以通过服务限制或实现此目的的其他方式来完成?
答案 0 :(得分:2)
如果您希望某些客户能够使用(或查看)您的服务,而某些客户不允许使用(或查看)您的服务,那么您需要在您的服务上设置身份验证,以便只有您自己的客户允许可以访问(或查看)您的服务。
我不知道您的整个场景,但使用基本身份验证的传输安全性可能就足够了。要启用它,您将在IIS中禁用匿名访问,配置IIS以使用Basic Auth,然后在绑定配置集中:
<security mode="Transport">
<transport clientCredentialType="Basic" />
</security>
设置mex绑定以使用安全绑定而不是默认的mexHttpBinding。
您还需要为您的站点提供SSL证书(如果使用WSHttpBinding)。
更新:这是一个示例Custom Secure Metadata Endpoint,演示了如何使用安全元数据端点实现服务。
答案 1 :(得分:1)
不,WCF中没有允许某些客户端使用您的服务同时禁止其他客户端的机制。你需要从不同的角度来看待它。
一种方法是不自动发布服务中的元数据 - 例如使其几乎“不可见” - 然后以一个或多个WSDL和一个或多个XSD文件的形式将必要的元数据信息分发给您想要连接到服务的客户端。如果您的元数据不可用,那么只是浏览您的服务地址的人将无法获得有关呼叫内容的任何信息。
元数据交换由<serviceMetadata>
行为控制,并在您的服务上设置“mex”端点。删除这两个,您的服务是不可见的。
另一种方法是禁止任何外部用户根据防火墙和网络规则访问您的WCF服务器。这不能由WCF完成,但您的网络管理员可以限制哪些IP可以对运行WCF服务的计算机进行物理访问。
马克
更新:
为了将元数据发送给应该能够呼叫您的服务的用户,您可以执行以下两项操作之一:
1)使用svcutil.exe /t:metadata (path+name of your service assembly)
,您可以从服务程序集中提取元数据(例如MyServiceLibrary.dll
)。这将为您提供一个或多个WSDL以及一个或多个XSD文件,您需要将这些文件发送给目标用户。他们可以将这些文件放在硬盘上,然后在“添加服务引用”中,而不是输入URL来发现服务,他们可以输入主WSDL的名称(导入所有其他文件),他们会得到他们的客户代理。
或者:
2)启动并运行服务后,您可以在解决方案中“添加新项目”,选择类库(MyService.Client
),然后执行“添加服务引用”并输入您的服务URL。这将创建新类库中的所有必需文件和所有内容。编译此类库并将该程序集MyService.Client.dll
发送给您希望允许访问您的服务的用户。
使用这两种解决方案,您无需启用元数据交换,而其他人无法直接使用您的服务并获取所需的所有信息以便进行调用。