我有一個模塊化的應用程序,它在單獨的AppDomain中實例化事物並通過WCF管道與它們進行通信。我不希望我的流程之外的任何人能夠連接到這些管道。內部進程只有WCF命名管道通信?
對此提出建議?
<編輯>我對遠程處理知之甚少 - 編寫一個在遠程處理下使用遠程處理的傳輸是一個可怕的主意嗎? < /編輯>
我有一個模塊化的應用程序,它在單獨的AppDomain中實例化事物並通過WCF管道與它們進行通信。我不希望我的流程之外的任何人能夠連接到這些管道。內部進程只有WCF命名管道通信?
對此提出建議?
<編輯>我對遠程處理知之甚少 - 編寫一個在遠程處理下使用遠程處理的傳輸是一個可怕的主意嗎? < /編輯>
對不起,我可能會晚點......但遲到總比不到好:) 你可以做的是分享您的應用程序域之間的對象... 例如,在第一個創建一個隨機GUID並將其發送到第二個(序列化...)。 那麼,如果兩個應用程序域知道這個身份驗證令牌,你可以做這樣的事情:
/// <summary>
/// Inspect client messages : add GUID in headers
/// </summary>
internal class CProcessAuthenticationClientInspector : IClientMessageInspector
{
#region IClientMessageInspector Membres
public void AfterReceiveReply(ref System.ServiceModel.Channels.Message reply, object correlationState)
{
}
public object BeforeSendRequest(ref System.ServiceModel.Channels.Message request, System.ServiceModel.IClientChannel channel)
{
request.Headers.Add(MessageHeader.CreateHeader("ProcessAuth", "http://schemas.YOURCOMPANY.com/YOURAPPID", CProcessAuthenticationBehavior._authToken));
return null;
}
#endregion
}
/// <summary>
/// Inspect server messages : Check GUID
/// </summary>
internal class CProcessAuthenticationDispatchInspector : IDispatchMessageInspector
{
#region IDispatchMessageInspector Membres
public object AfterReceiveRequest(ref Message request, System.ServiceModel.IClientChannel channel, System.ServiceModel.InstanceContext instanceContext)
{
Guid token = OperationContext.Current.IncomingMessageHeaders.GetHeader<Guid>("ProcessAuth", "http://schemas.YOURCOMPANY.com/YOURAPPID");
if (token != CProcessAuthenticationBehavior._authToken)
throw new Exception("Invalid process");
return null;
}
public void BeforeSendReply(ref Message reply, object correlationState)
{
}
#endregion
}
/// <summary>
/// Add inspectors on both client and server messages
/// </summary>
public class CProcessAuthenticationBehavior : IEndpointBehavior
{
/// <summary>
/// Authentification token known by both sides of the pipe
/// </summary>
internal static Guid _authToken = Guid.NewGuid();
#region IEndpointBehavior Membres
public void AddBindingParameters(ServiceEndpoint endpoint, System.ServiceModel.Channels.BindingParameterCollection bindingParameters)
{
}
public void ApplyClientBehavior(ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.ClientRuntime clientRuntime)
{
clientRuntime.MessageInspectors.Add(new CProcessAuthenticationClientInspector());
}
public void ApplyDispatchBehavior(ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.EndpointDispatcher endpointDispatcher)
{
endpointDispatcher.DispatchRuntime.MessageInspectors.Add(new CProcessAuthenticationDispatchInspector());
}
public void Validate(ServiceEndpoint endpoint)
{
}
#endregion
}
然後你只需要您的端點行爲添加到您的端點雙方:
客戶端:
ChannelFactory<TInterface> factory;
factory = new ChannelFactory<TInterface>(BuildLocalBinding(), "net.pipe://localhost/foo");
factory.Endpoint.Behaviors.Add(new CProcessAuthenticationBehavior());
服務器:
ServiceHost svcHost = new System.ServiceModel.ServiceHost(imlpementationType);
svcHost.AddServiceEndpoint(interfaceType, binding, "net.pipe://localhost/foo");
svcHost.Description.Endpoints[0].Behaviors.Add(new CProcessAuthenticationBehavior());
嗯......這可能是在配置完成,但我會讓你挖:)
希望這會有所幫助。
我不必實現這一點,但回顧一下我的舊問題,知道我現在知道什麼時候,使用在設置時傳遞給其他域的密鑰對中央應用程序域進行身份驗證肯定會起作用。 –
您可以爲綁定添加一些安全行爲。它們讓您需要驗證,簽名內容並對其進行加密,具體取決於您的安全需求。
有關更多詳細信息,請參閱MSDN上的WCF Security Fundamentals。
你能更具體嗎?我瞭解了WCF的這些功能以及它們如何幫助確保它的整體安全性,但我如何才能實現我的特定目標? –
... netNamedPipeBinding綁定,它在同一臺機器上提供跨進程 通信。命名管道不穿過 機器工作...
的NetNamedPipeBinding會實現自己的目標。
NetNamedPipeBinding is optimized for on-machine communication。
命名管道僅限於本地機器嗎?你不能調用只通過另一臺機器通過管道進行通信的服務,對吧? –
@Terry Donaghe:是的,你是對的,我正在考慮那些過去使用通過tcp代理的命名管道的不幸日子.....不寒而慄。我會相應地更新我的答案。 – Brook
我現在使用的是NetNamedPipeBindings,但是這些對於同一臺機器上的用戶仍然是開放的。並且我認爲註冊的管道URI是可發現的。我的意思是,我認爲這是一個微不足道的安全問題,但是如果可能的話,我想盡可能地用它做點什麼。 –
您可以嘗試* [NullTransport](http://www.codeproject.com/KB/WCF/NullTransportForWCF.aspx),但這可能是相同的AppDomain-only –
是的,這是相同的AppDomain。 –
命名管道只能在本地機器上使用。您是否擔心該機器上的其他應用會嘗試訪問您的服務? –