Sam*_*eer 6 security wcf acl named-pipes netnamedpipebinding
我是WCF和命名管道的新手.
我需要一种方法在同一台机器上的UI应用程序和Windows服务之间进行安全通信.这就是我需要的: - 客户端UI应用程序需要将各种消息类型发送(推送)到Windows服务. - 客户端UI应用程序需要将从服务(推送或拉取)接收各种消息类型.
(此处的消息只是结构化的序列化数据).
现在所有这些交换只能在授权用户帐户下进行(可能与服务帐户不同).所以我在考虑为服务和用户帐户ACL命名一个命名管道.
但是,命名管道仅支持流.我有多种类型的消息需要通过命名管道进行交换,这意味着我需要定义它们并对它们进行序列化/反序列化.
为了避免这种情况,我想到了在命名管道上使用WCF(用于序列化和RPC支持).还在Windows服务中托管WCF服务.
问题1)这是一个好方法吗?我在WCF下使用http或tcp时犹豫不决,因为通信必须保留在机器内.
问题2)我是否以及如何对WCF将使用的命名管道进行ACL?这是我可以控制的吗?我觉得使用特定SID对名称管道进行ACL操作可以提供更好的安全性,而不是在客户端和服务器之间实现身份验证方案.
感谢您的任何指示,建议!萨米尔
1)我认为这是一个很好的方法.你的想法很明显.
2)正如您似乎已经发现的那样,我的博客文章向您展示了一种在WCF NetNamedPipe绑定创建的管道上设置ACL的方法.它涉及使用反射来填补微软实现中的空白,这实际上最初是为了支持设置ACL的直接机制,但没有正确完成.
派生一个 AclSecuredNamedPipeBinding
来自CustomBinding
和一个相应AclSecuredNamedPipeTransportBindingElement
的NamedPipeTransportBindingElement
.绑定元素有一个列表SecurityIdentifier
:
internal List<SecurityIdentifier> AllowedUsers { get { return _allowedUsers; } }
private List<SecurityIdentifier> _allowedUsers = new List<SecurityIdentifier>();
Run Code Online (Sandbox Code Playgroud)
本BuildChannelListener<TChannel>(BindingContext)
-方法被覆盖来设置私有财产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;
}
Run Code Online (Sandbox Code Playgroud)
如果你走这条路线,一定要修补"抢注漏洞",如后面的帖子所述.
归档时间: |
|
查看次数: |
5935 次 |
最近记录: |