4 votes

Communication named pipe WCF uniquement en intra-processus ?

J'ai une application modulaire qui instancie des choses dans des domaines d'application séparés et communique avec eux par des tuyaux WCF. Je ne veux pas que quelqu'un d'extérieur à mon processus soit capable de se connecter à ces tuyaux.

Des suggestions ?

<edit>Je ne connais pas bien le remoting -- serait-ce une idée terrible d'écrire un transport qui utilise le remoting sous le capot ? </edit>.

2voto

Kek Points 2046

Désolé, je suis peut-être en retard... mais mieux vaut tard que jamais :) Ce que vous pourriez faire est de partager un objet entre vos AppDomains... Par exemple créer un GUID aléatoire dans le premier et l'envoyer au second (sérialisation...). ensuite, si les deux domaines d'application connaissent ce jeton d'authentification, vous pouvez faire quelque chose comme ceci :

/// <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
}

Ensuite, il vous suffit d'ajouter le comportement de votre endpoint à votre endpoint des deux côtés :

client :

ChannelFactory<TInterface> factory;
factory = new ChannelFactory<TInterface>(BuildLocalBinding(), "net.pipe://localhost/foo");
factory.Endpoint.Behaviors.Add(new CProcessAuthenticationBehavior());

serveur :

ServiceHost svcHost = new System.ServiceModel.ServiceHost(imlpementationType);
svcHost.AddServiceEndpoint(interfaceType, binding, "net.pipe://localhost/foo");
svcHost.Description.Endpoints[0].Behaviors.Add(new CProcessAuthenticationBehavior());

Bon... cela peut être fait dans la configuration, mais je vous laisse creuser :)

J'espère que cela vous aidera.

1voto

Coincoin Points 12823

Vous pouvez ajouter certains comportements de sécurité à votre fixation. Ils vous permettent d'exiger une authentification, de signer le contenu et de le chiffrer, en fonction de vos besoins en matière de sécurité.

Ver Principes fondamentaux de la sécurité WCF sur MSDN pour plus de détails.

0voto

Brook Points 3985

... la liaison netNamedPipeBinding, qui fournit une communication inter-processus sur la même machine. Les tubes nommés ne fonctionnent pas entre machines...

El NetNamedPipeBinding permettrait d'atteindre vos objectifs.

NetNamedPipeBinding est optimisé pour le travail sur machine communication.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X