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.