Bonjour à tous,
j'essaie de faire une application test toute simple qui a pour but de passer l'identitié d'un client à un serveur qui expose un objet distant instancié depuis une application cliente.
Voice le code client :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 #region private void InstanciateRemoteClass() private void InstanciateRemoteClass() { BinaryClientFormatterSinkProvider clientProvider = new BinaryClientFormatterSinkProvider(); BinaryServerFormatterSinkProvider serverProvider = new BinaryServerFormatterSinkProvider(); serverProvider.TypeFilterLevel = System.Runtime.Serialization.Formatters.TypeFilterLevel.Full; IDictionary props = new Hashtable(); props["name"] = System.Guid.NewGuid().ToString(); props["secure"] = "true"; props["tokenImpersonationLevel"] = "Identification"; props["protectionLevel"] = "EncryptAndSign"; props["impersonationLevel"] = "Identity"; props["typeFilterLevel"] = System.Runtime.Serialization.Formatters.TypeFilterLevel.Full; _channel = new TcpChannel(props, clientProvider, serverProvider); ChannelServices.RegisterChannel(_channel,true); _obj = (MarshalByRefObject)RemotingServices.Connect( typeof(IRemotingObject), "tcp://127.0.0.1:8085/RemoteObject"); _is = (IRemotingObject)_obj; } public string ShowUserName() { return _is.ShowUserName(); }
la methode ShowUserName affiche sur le serveur (application console) le nom de la personne qui a instancié lo'bjet distant depuis son poste client.
le code correspondant est le suivant :
le code coté serveur est le suivant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 public void ShowUserName() { Console.WriteLine(WindowsIdentity.GetCurrent().Name); }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 Dictionary<string, string> properties = new Dictionary<string, string>(); properties["name"] = "tcp Channel with binary formatter"; properties["priority"] = "15"; properties["port"] = "8085"; properties["host"] = "127.0.0.1"; properties["secure"] = "true"; properties["impersonate"] = "true"; BinaryServerFormatterSinkProvider sinkProvider = new BinaryServerFormatterSinkProvider(); TcpServerChannel tcpChannel = new TcpServerChannel(properties, sinkProvider); ChannelServices.RegisterChannel(tcpChannel,true); RemotingConfiguration.RegisterWellKnownServiceType(typeof(RemoteObject), "RemoteObject", WellKnownObjectMode.SingleCall); Console.WriteLine("Remoted Object is exposed !!");
avec ce code ci , j'ai une exception qui est lévée :
---------------------------
---------------------------
Échec d'ouverture de session sur le réseau - Une condition de sécurité du côté distant n'a pas été remplie lors de l'authentification. Essayez d'augmenter les valeurs ProtectionLevel et/ou ImpersonationLevel.
---------------------------
OK
---------------------------
J'ai essayé de modifier les propriétés proposés dans le message d'erreur mais rien n'y fait j'ai toujours le meme message.
Par contre ci je remplace la propriété du canal TCP coté client suivante
props["tokenImpersonationLevel"] = "Identification";
par
props["tokenImpersonationLevel"] = "impersonation";
cela fonctionne
seulement cela veut aussi dire que le compte client sert de substitue au compte serveur ce qui ne m'arrange pas le coté client n'a pas forcément les droits suffisants sur le serveur, c'est pourquoi j'utilise le mode identification juste pour récupérer le userName du client coté serveur.
Est ce que qqun aurait une idée ??
Merci d'avance.
Partager