【发布时间】:2010-11-28 09:52:01
【问题描述】:
我有一些服务正在被安全区域内的客户端使用。我被要求保护这些服务,防止开发客户错误地连接到错误的服务。
这个想法是在客户端和服务主机的配置中设置的预共享密钥(如 guid)。每当客户端尝试使用服务时,它必须提供正确的密钥。
我将如何配置服务来实现这种安全性?需要多少定制?
【问题讨论】:
我有一些服务正在被安全区域内的客户端使用。我被要求保护这些服务,防止开发客户错误地连接到错误的服务。
这个想法是在客户端和服务主机的配置中设置的预共享密钥(如 guid)。每当客户端尝试使用服务时,它必须提供正确的密钥。
我将如何配置服务来实现这种安全性?需要多少定制?
【问题讨论】:
您可以轻松地为每个调用添加自定义消息头 - 实际上很容易做到,而且它不会“污染”您的实际服务合同,例如您不必为了传递它而在服务调用中添加额外的参数。
有关如何实现此目的的信息,请参阅这些文章:
基本上,您需要将对服务的调用包装在 OperationContext 中 - 仅此而已,不需要 ClientMessageInspector 和其他技巧 :-)
using (OperationContextScope scope = new OperationContextScope(proxy))
{
Guid myToken = Guid.NewGuid();
MessageHeader<Guid> mhg = new MessageHeader<Guid>(myToken);
MessageHeader untyped = mhg.GetUntypedHeader("token", "ns");
OperationContext.Current.OutgoingMessageHeaders.Add(untyped);
proxy.DoOperation(...);
}
在服务器端,您可以简单地检查IncomingMessageHeaders 集合:
Guid myToken = OperationContext.Current.
IncomingMessageHeaders.GetHeader<Guid>("token", "ns");
马克
【讨论】:
我会让客户端将密钥作为额外的消息标头发送,并创建一个 IDispatchMessageInspector 来检查标头并选择性地拒绝它。 This代码项目文章描述了基于IP地址的过滤部分。
【讨论】:
如果您使用密钥执行此操作,您将更改服务合同以包含将放置密钥的字段。然后在服务器端检查密钥中的值。
但是,在您的情况下,您可以通过网络配置限制允许哪些 IP 地址访问服务。这比更改服务的签名要少。
【讨论】: