【发布时间】:2009-05-10 14:18:37
【问题描述】:
我的问题是关于保护对仅向我们公司内部用户公开的 WCF 服务的访问的最佳(也称为“最不痛苦”)方法。目标是确保仅通过我们每个用户安装的单个 Windows 窗体应用程序访问该服务。调用服务时,我希望服务能够验证它是从允许的应用程序调用的。
要保护的服务使用支持流的basicHttpBinding,所以我相信我仅限于传输级别的安全性。
以下是我的服务配置文件中 <bindings> 和 <services> 部分的简化版本。
<bindings>
<basicHttpBinding>
<binding name="Service1Binding" transferMode="Streamed"/>
</basicHttpBinding>
</bindings>
<services>
<service name="WCFServiceSecurity.Service1"
behaviorConfiguration="WCFServiceSecurity.Service1Behavior">
<endpoint address=""
binding="basicHttpBinding"
contract="WCFServiceSecurity.IService1"
bindingConfiguration="Service1Binding"/>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>
</services>
谁能提供一些详细信息,说明我需要采取哪些操作才能在此服务上实施安全性?
注意:我是 WCF 新手,完全不熟悉安全性,所以如果我没有提供足够的详细信息,请告诉我。
更新:
作为suggested by marc_s,我想使用某种用户名/密码机制来保护WCF 服务。这为答案提供了更多方向,但我仍然对 如何 实际执行此操作有些模糊。
因为我的服务需要启用流式传输,所以我必须使用 basicHttpBinding 和传输级安全性(对吗?);此外,我的服务中包含的方法只能接受 Stream 对象。
考虑到这些限制以及我使用用户名/密码验证的偏好...
- 我应该如何修改我的服务的配置文件以强制提供用户名/密码凭据?
- 我的服务将如何验证提供的凭据?
- 我的客户端应用程序在拨打电话时如何将凭据传递给服务?
- 这是否需要使用 SSL,如果需要,所有客户端计算机是否也需要证书?
更新:
在向我的老板解释了我在保护这项服务时遇到的麻烦之后,我被允许尝试 Windows 身份验证路由。可悲的是,我在使用我的 Streamed 服务 (argh) 实现这种类型的身份验证时没有运气。在进行适当的更改(如here 所述 - 唯一的例外是我的transferMode="Streamed")并访问我的服务后,我收到以下错误:
HTTP 请求流不能与 HTTP 身份验证结合使用。禁用请求流式传输或指定匿名 HTTP 身份验证。
然后我偶然发现以下引用 here 提供了一些说明:
您不能进行传输验证。使用流式传输。 如果您必须使用 HTTP 请求流式传输,则必须在没有安全性的情况下运行。
安全工作的方式是:
WCF 客户端向服务器发出 http 请求。
服务器回应说,“你没有被授权,给我一个基本/摘要/等凭据。”
客户端收到该响应并重新发送带有凭据的消息。
现在服务器收到消息,验证凭据,然后继续。 请求流不是为使用该安全模式而设计的。如果是这样,那将非常慢,因为客户端将发送整个流,从服务器获取未授权的消息,然后它必须重新发送带有凭据的整个流。
所以现在我正在寻找意见,您将如何保护启用流式传输的 WCF 服务? 如前所述,某种用户名/密码机制将是首选。随意在这个问题上跳出框框思考......
非常感谢任何帮助!
【问题讨论】:
-
如果可能,将绑定更改为 StreamedRequest 或 StreamedResponse,您将能够启用传输身份验证。如果必须,请仅使用流式绑定,但我相信您可以将上传和下载拆分到不同的端点以启用此安全性。
标签: wcf wcf-security