2011-02-25 95 views
5

是WCF和命名管道的新手。保護WCF使用的命名管道

我需要一種方法來在同一臺機器上的UI應用程序和Windows服務之間進行安全通信。以下是我需要的: - 客戶端UI應用程序需要將各種消息類型發送(推送)到Windows服務。 - 客戶端UI應用程序需求將從服務接收各種消息類型(推送或拉取)。

(這裏的消息只是一個結構化的序列化數據)。

現在所有這些交換隻能在授權用戶帳戶(可能與服務帳戶不同)下發生。所以我正在考慮爲服務和用戶帳戶ACL命名管道。

但是,命名管道僅支持流。我有多種類型的消息需要通過命名管道交換,這意味着我需要定義它們並對它們進行序列化/反序列化。

爲了避免這種情況,我想在命名管道上使用WCF(用於序列化和RPC支持)。還在Windows服務中託管WCF服務。

問題1) 這是一個很好的方法嗎?我在WCF下面使用http或tcp猶豫不決,因爲通信必須保留在機器內部。

問題2) 如何以及如何ACL ACL WCF將使用的命名管道?這是我可以控制的東西嗎? 我覺得使用特定的SID對名稱管道進行ACL管理可以提供更好的安全性,而不是在客戶端和服務器之間實現身份驗證方案。

感謝您的指點,建議! 薩米爾

回答

8

1)我認爲這是一個不錯的辦法。你的想法是現貨。

2)正如你似乎已經發現的,由WCF NetNamedPipe綁定創建的my blog post here shows you one way to set the ACL on the pipe。它涉及到使用反射來填補微軟實施中的空白,這種空白最初意在支持設置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中所述。

+3

很抱歉,此博客已不存在。任何人都記得該做什麼?我嘗試使用反射設置允許的用戶,但沒有做到我所希望的。你能幫忙的話,我會很高興。 – mageos 2014-06-18 16:38:17

0

我嘗試了上面「Chris Disson的博客」中提出的建議,但在管理員權限中運行服務代碼後,得到了以下異常。 「StudentService存在問題部分或全部標識引用無法翻譯。「 這裏是我的代碼服務

AclSecuredNamedPipeBinding binding = new AclSecuredNamedPipeBinding(); 
SecurityIdentifier allowedGroup = (SecurityIdentifier)(new 
NTAccount("NPServiceUsers").Translate(typeof(SecurityIdentifier))); 
binding.AddUserOrGroup(allowedGroup); 
studentServiceHost = new ServiceHost(typeof(StudentService.StudentService)); 
Uri httpBaseAddress = new 
Uri("net.pipe://localhost/ServiceHost/ServiceHost"); 

studentServiceHost.AddServiceEndpoint(
typeof(StudentService.IStudentService),binding, httpBaseAddress); 
studentServiceHost.Open(); 

然後我試圖通過改變NTACCOUNT哪個主機‘NPServiceUsers’到‘管理員’,然後我得到的異常以下。

」有是StudentService對象引用的一個問題不設置爲一個對象的一個​​實例。」

studentService是類實現的IStudentService接口。

public class StudentService : IStudentService 
{ 
public void DoWork() 
{ 
} 
}