我有一些服务正在安全区域内的客户端使用。我被要求保护这些服务,通常是针对错误地连接到错误服务的开发客户端。
这个想法是预先共享密钥(如guid),它在客户端和服务主机的配置中设置。每当客户端尝试使用该服务时,它必须提供正确的密钥。
我如何配置服务来实现这种安全性?需要多少定制?
答案 0 :(得分:3)
您可以轻松地为每个调用添加自定义邮件标题 - 实际上非常容易实现,并且它不会“污染”您的真实服务合同,例如您不必为服务调用添加额外的参数,只是为了传递它。
有关如何实现此目的的信息,请参阅这些文章:
基本上,你需要在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");
马克
答案 1 :(得分:2)
我希望客户端将密钥作为额外的消息头发送,并创建一个IDispatchMessageInspector来检查标头并可选择拒绝它。 This代码项目文章描述了基于IP地址的过滤器部分。
答案 2 :(得分:0)
如果使用密钥执行此操作,则可以更改服务的合同以包括密钥所在的字段。然后检查服务器端密钥中的值。
但是,在您的情况下,您可以通过网络配置限制允许哪些IP地址访问服务。这比改变服务的签名要少。