如何使用共享密钥限制对WCF服务的访问

时间:2009-09-15 09:41:41

标签: wcf security service

我有一些服务正在安全区域内的客户端使用。我被要求保护这些服务,通常是针对错误地连接到错误服务的开发客户端。

这个想法是预先共享密钥(如guid),它在客户端和服务主机的配置中设置。每当客户端尝试使用该服务时,它必须提供正确的密钥。

我如何配置服务来实现这种安全性?需要多少定制?

3 个答案:

答案 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地址访问服务。这比改变服务的签名要少。