保护WCF使用的命名管道

时间:2011-02-25 21:15:56

标签: wcf security named-pipes acl netnamedpipebinding

是WCF和命名管道的新手。

我需要一种在同一台计算机上的UI应用程序和Windows服务之间进行安全通信的方法。这就是我需要的: - 客户端UI应用程序需要将各种消息类型发送(推送)到Windows服务。 - 客户端UI应用程序需要将从服务(推或拉)接收各种消息类型。

(此处的消息只是结构化的序列化数据)。

现在所有这些交换只能在授权用户帐户下进行(可能与服务帐户不同)。所以我考虑为服务和用户帐户ACL命名一个命名管道。

但是,命名管道仅支持流。我有多种类型的消息需要通过命名管道进行交换,这意味着我需要定义它们并对它们进行序列化/反序列化。

为了避免这种情况,我想到了在命名管道上使用WCF(用于序列化和RPC支持)。还在Windows服务中托管WCF服务。

问题1) 这是一个好方法吗?我在WCF下使用http或tcp时犹豫不决,因为通信必须保留在机器内。

问题2) 如果以及如何对WCF将使用的命名管道进行ACL?这是我可以控制的吗? 我觉得使用特定SID对名称管道进行ACL操作可以提供更好的安全性,而不是在客户端和服务器之间实现身份验证方案。

感谢您的任何指示,建议! 萨米尔

3 个答案:

答案 0 :(得分:8)

1)我认为这是一个很好的方法。你的想法很明显。

2)正如您似乎已经发现的那样,my blog post here shows you one way to set the ACL on the pipe由WCF NetNamedPipe绑定创建。它涉及使用反射来填补微软实现中的空白,这实际上最初是为了支持设置ACL的直接机制,但是没有正确完成。

CustomBinding获取AclSecuredNamedPipeBinding,从NamedPipeTransportBindingElement获取相应的AclSecuredNamedPipeTransportBindingElement。绑定元素包含SecurityIdentifier

的列表
internal List<SecurityIdentifier> AllowedUsers { get { return _allowedUsers; } }
private List<SecurityIdentifier> _allowedUsers = new List<SecurityIdentifier>();

重写BuildChannelListener<TChannel>(BindingContext)-method以设置私有属性AllowedUsers

public override IChannelListener<TChannel> BuildChannelListener<TChannel>(BindingContext context)
{
  private static Type namedPipeChannelListenerType 
          = Type.GetType("System.ServiceModel.Channels.NamedPipeChannelListener, System.ServiceModel", false);
  IChannelListener<TChannel> listener = base.BuildChannelListener<TChannel>(context);
  PropertyInfo p = namedPipeChannelListenerType.GetProperty(
          "AllowedUsers", BindingFlags.Instance|BindingFlags.NonPublic);
  p.SetValue(listener, _allowedUsers, null);
  return listener;
}

如果你走这条路,请务必按照a later post中的说明修补“抢注漏洞”。

答案 1 :(得分:3)

答案 2 :(得分:0)

我尝试了上面“Chris Disson的博客”中的建议但是在管理员权限中运行服务代码后,得到了以下异常。 “StudentService存在问题,无法翻译部分或全部身份参考。” 这是我托管服务的代码

1000

然后我尝试将nTAccount从“NPServiceUsers”更改为“Administrators”,然后我得到了以下异常。

“StudentService Object引用未设置为对象实例存在问题。”

studentService是实现IStudentService接口的类。

Content Compression Resistance Priority