1

如果我托管 WCF 服务以便某人(即我认识的人)可以使用我的服务,但如果其他人(即我不认识的人)使用它,我会怎么做?我该如何防止这种情况?如何实现?

是否可以通过服务节流来完成,或者有什么其他方法可以实现这一目标?

4

2 回答 2

2

如果您希望某些客户端能够使用(或查看)您的服务,而某些客户端不允许使用(或查看)您的服务,那么您需要在您的服务上设置身份验证,以便只有您允许的客户端才能访问(或查看)您的服务。

我不知道您的整个情况,但是使用基本身份验证的传输安全性可能就足够了。要启用该功能,您将在 IIS 中禁用匿名访问,请将 IIS 配置为使用基本身份验证,然后在绑定配置集中:

<security mode="Transport">
  <transport clientCredentialType="Basic" />
</security>


将您的 mex 绑定设置为使用安全绑定而不是默认的 mexHttpBinding。您的站点还需要 SSL 证书(如果使用 WSHttpBinding)。

更新:这是一个示例,自定义安全元数据端点,它演示了如何使用安全元数据端点实现服务。

于 2009-08-07T06:24:05.130 回答
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发送给您希望允许访问您的服务的用户。

使用这两种解决方案,您无需启用元数据交换,其他人也不能直接上前使用您的服务并获取调用它所需的所有信息。

于 2009-08-07T06:15:31.480 回答