2009-08-07 88 views
1

如果我托管一个WCF服务,以便某个人(即我知道的某个人)可以使用我的服务,但如果其他人(即我不知道的人)使用它,那么会怎样呢?我如何防止这种情况发生?如何实现这一目标?如何防止他人添加托管的wcf服务的服务引用?

它可以通过服务节流或其他方式来实现吗?

回答

1

不,在WCF中没有任何机制允许某些客户端使用您的服务,同时禁止他人。你需要从另一个角度来看待这个问题。

一种方法是不自动发布您的服务中的元数据 - 例如,使它几乎“不可见” - 然后以一个或多个WSDL以及一个或多个XSD文件的形式将必要的元数据信息分发给您希望连接到您的服务的客户端。如果您的元数据不可用,那么只是浏览您的服务地址的人将无法获得有关要致电的信息。

元数据交换由<serviceMetadata>行为控制,并且在您的服务上有一个“mex”端点。删除这两个,你的服务是不可见的。

另一种方法是禁止任何外部用户根据防火墙和网络规则访问您的WCF服务器。这不能由WCF完成,但是您的网络管理员可能会限制哪些IP对WCF服务运行的机器具有物理访问权限。

马克

UPDATE:
为了出货元数据,以这些用户应该能够打电话给你的服务谁,你可以做两件事情之一:

1)使用svcutil.exe /t:metadata (path+name of your service assembly),可以提取来自服务程序集的元数据(例如MyServiceLibrary.dll)。这将为您提供一个或多个WSDL以及一个或多个XSD文件,您需要将这些文件发送给目标用户。他们可以将这些文件放在他们的硬盘上的某个地方,然后在“添加服务参考”中,而不是输入URL来发现服务,他们可以键入主WSDL的名称(导入所有其他文件),他们会得到他们的客户代理。

或者:

2)随着服务启动并运行,你可以“添加新项目”,以您的解决方案,选择一个类库(MyService.Client),然后做一个“添加服务引用”,并输入您的服务URL。这将创建新类库中的所有必需文件和所有内容。编译此类库并将该程序集MyService.Client.dll发送给您希望允许访问您的服务的用户。

使用这两种解决方案,您不需要启用元数据交换,并且其他人不能只是走到您的服务并获取所需的所有信息来调用它。

+0

但是服务使用元数据交换端点来向客户描述自己吗?如果我删除端点并使,那么如果我不能发布它,以及如何在客户端上添加服务引用? – kurozakura 2009-08-07 08:06:19

+0

我认为这正是你想要的 - 不允许每个人都添加服务引用,对吧?在这种情况下,您需要将WSDL和XSD发送给应该使用您的服务的客户端,并且他们需要根据他们获得的文件(而不是URL)添加服务引用。或者您可以编写自己的代理客户端类并将其放入程序集中,并将该预先构建的客户端代理发送给应该能够调用您的服务的用户。 – 2009-08-07 08:14:43

+0

感谢marc:D我知道它可以通过代理来实现,但我认为我们可以同时使用url添加服务,并且只允许特权客户端,这样他们就可以更新服务而不是再次更新编译为DLL并将其部署到客户端 – kurozakura 2009-08-07 08:56:06

2

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

我不知道你的整个场景,但使用基本身份验证的传输安全性可能就足够了。为了让你会禁用IIS匿名访问,IIS配置为使用基本身份验证,然后在绑定的配置设置:

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


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

更新:下面是一个示例,Custom Secure Metadata Endpoint演示了如何使用安全的元数据端点实现服务。

+0

这不允许某些用户调用您的服务 - 但它不会阻止他们首先添加服务引用。 – 2009-08-07 08:15:20

+1

mex的默认绑定是匿名的mexHttpBinding。您可以更改该绑定以使用像wsHttpBinding这样的安全绑定。鉴于在确保WSDL和实际服务之间的选择,我总是希望确保服务的安全。如果服务位于互联网上,即使您不公开WSDL,也可以通过嗅探线路来确定您的服务接口。 – 2009-08-08 02:44:02

相关问题