Francesco Geri

Il blog di Francesco Geri
posts - 94, comments - 165, trackbacks - 2

.Net Remoting: chiamare un metodo server con le credenziali del client

Tramite .Net Remoting è possibile creare un oggetto su un server tramite una chiamata dal client e fargli fare qualche cosa.
Normalmente lato server l’operazione viene eseguita con le credenziali dell’applicazione ospitante, ovvero il server. Se si vuole che venga eseguita con le credenziali del client si può procedere come segue.

Per primo creiamo una dll che sarà poi condivisa dal client e dal server, che eseguirà l’operazione desiderata. Creiamo per questo un progetto libreria di classi con il seguente codice:

using System;
using System.Security.Principal;
 
namespace CodeGuru.RemotingSample
{
    /// <remarks>
    /// Sample object to demonstrate the use of .NET remoting and IPC.
    /// </remarks>
    public class SampleObject : MarshalByRefObject
    {
        /// <summary>
        /// Constructor
        /// </summary>
        public SampleObject()
        {
        }
 
        /// <summary>
        /// Return a hello message
        /// </summary>
        /// <returns>Hello world message</returns>
        public string HelloWorld()
        {
            return "Hello World " + System.Security.Principal.WindowsIdentity.GetCurrent().Name;
        }
        
    }
}

 

Ora creiamo il progetto server. Facciamo un’applicazione console con la reference alla System.Runtime.Remoting e con il seguente codice:

using System;
using System.Collections;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
 
namespace CodeGuru.RemotingSample
{
    /// <remarks>
    /// Sample server to demonstrate the use of secure .NET Remoting.
    /// </remarks>
    public class SampleRemotingServer
    {
        public static void Main()
        {
            // Setup the configuration parameters through a dictionary
            IDictionary properties = new Hashtable();
            properties.Add("port", 9977);
            properties.Add("secure", true);
            properties.Add("impersonate", true);
 
            // Create an instance of a channel
            TcpServerChannel serverChannel =
                new TcpServerChannel(properties, null);
            ChannelServices.RegisterChannel(serverChannel, true);
 
            // Register as an available service with the name HelloWorld
            RemotingConfiguration.RegisterWellKnownServiceType(typeof(SampleObject),
                    "HelloWorldUri" ,
                    WellKnownObjectMode.Singleton);
 
            Console.WriteLine("Listening on {0}", serverChannel.GetChannelUri());
            Console.WriteLine("Press the enter key to exit...");
            Console.ReadLine();
        }
    }
}

 

Infine creiamo il progetto client. Facciamo un’applicazione console con la reference alla System.Runtime.Remoting e con il seguente codice:

using System;
using System.Collections;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
 
namespace CodeGuru.RemotingSample
{
    /// <remarks>
    /// Sample client to demonstrate the use of secure .NET Remoting.
    /// </remarks>
    public class SampleRemotingClient
    {
        public static void Main()
        {
            // Setup the configuration parameters through a dictionary
            IDictionary properties = new Hashtable();
            properties.Add("secure", true);
            properties.Add("connectionTimeout", 5000);
            properties.Add("tokenImpersonationLevel", "Impersonation");
 
            // Create a channel for communicating w/ the remote object
            TcpClientChannel clientChannel =
                new TcpClientChannel(properties, null);
            ChannelServices.RegisterChannel(clientChannel, true);
 
            // Create an instance of the remote object
            RemotingConfiguration.RegisterWellKnownClientType(
                    typeof(SampleObject),
                    "Tcp://MyServerName:9977/HelloWorldUri");
 
            SampleObject sample = new SampleObject();
            Console.WriteLine("{0}", sample.HelloWorld());
 
            Console.WriteLine("Press the enter key to exit...");
            Console.ReadLine();
        }
    }
}

 

Eseguiamo il server, poi eseguiamo il client lanciandolo con le credenziali di un utente di test per verificare il risultato.

 

Fonte: http://www.developer.com/net/net/article.php/3522466/Improved-NET-Remoting-Part-2-Secure-TCP.htm

 

Lo stesso risultato lo si può ottenere tramite file di configurazione (app.config):

Lato Server
app.config:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.runtime.remoting>
        <application>
            <channels>
                <channel ref="tcp" 
                                 port="9977" 
                                 secure="true" 
                                 impersonate="true" 
                                 authenticationMode="ImpersonateCallers"/>
            </channels>
            <service>
                <wellknown mode="SingleCall" type="MyServer.SampleObject, MyServer"
objectUri="SampleObjectURI" />
            </service>
        </application>
    </system.runtime.remoting>
</configuration>


codice per la lettura del file di configurazione:

System.Runtime.Remoting.RemotingConfiguration.Configure(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile, True)

 

Lato Client

app.config:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.runtime.remoting>
        <application>
            <channels>
                <channel ref="tcp" 
                                 port="8888" 
                                 secure="true" 
                                 tokenImpersonationLevel="impersonation"/>
            </channels>
            <client>
                <wellknown type="MyServer2.SampleObject, MyServer2" url="Tcp://MyServerName:9977/SampleObjectURI" />
            </client>
        </application>
    </system.runtime.remoting>
</configuration>


codice per la lettura del file di configurazione:

System.Runtime.Remoting.RemotingConfiguration.Configure(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile, True)

 

Fonte http://nettecharticles.blogspot.com/2008/06/netremotingimpersonate-client-user-on.html

Print | posted on lunedì 26 aprile 2010 13:06 |

Powered by:
Powered By Subtext Powered By ASP.NET