gpt4 book ai didi

c# - 混合安全和不安全的 channel

转载 作者:IT王子 更新时间:2023-10-29 04:45:08 26 4
gpt4 key购买 nike

一旦注册了安全通道,我就无法使用不安全通道。下面的代码只有在客户端之前注册了不安全的 channel 时才有效。

是否可以在不限制注册顺序的情况下混合使用安全和不安全的 channel ?

using System;
using System.Collections;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;

public class SampleObject : MarshalByRefObject
{
public DateTime GetTest() { return DateTime.Now; }
}
public class SampleObject2 : MarshalByRefObject
{
public DateTime GetTest2() { return DateTime.Now; }
}
static class ProgramClient
{
private static TcpClientChannel RegisterChannel(bool secure, string name, int priority)
{
IDictionary properties = new Hashtable();
properties.Add("secure", secure);
properties.Add("name", name);
properties.Add("priority", priority);
var clientChannel = new TcpClientChannel(properties, null);
ChannelServices.RegisterChannel(clientChannel, false);
return clientChannel;
}
private static void Secure()
{
RegisterChannel(true, "clientSecure", 2);
var testSecure = (SampleObject2)Activator.GetObject(typeof(SampleObject2), "tcp://127.0.0.1:8081/Secured.rem");
Console.WriteLine("secure: " + testSecure.GetTest2().ToLongTimeString());
}
private static void Unsecure()
{
RegisterChannel(false, "clientUnsecure", 1);
var test = (SampleObject)Activator.GetObject(typeof(SampleObject), "tcp://127.0.0.1:8080/Unsecured.rem");
Console.WriteLine("unsecure: " + test.GetTest().ToLongTimeString());
}
internal static void MainClient()
{
Console.Write("Press Enter to start.");
Console.ReadLine();
// Works only in this order
Unsecure();
Secure();
Console.WriteLine("Press ENTER to end");
Console.ReadLine();
}
}
static class ProgramServer
{
private static TcpServerChannel RegisterChannel(int port, bool secure, string name)
{
IDictionary properties = new Hashtable();
properties.Add("port", port);
properties.Add("secure", secure);
properties.Add("name", name);
//properties.Add("impersonate", false);
var serverChannel = new TcpServerChannel(properties, null);
ChannelServices.RegisterChannel(serverChannel, secure);
return serverChannel;
}
private static void StartUnsecure()
{
RegisterChannel(8080, false, "unsecure");
RemotingConfiguration.RegisterWellKnownServiceType(typeof(SampleObject), "Unsecured.rem", WellKnownObjectMode.Singleton);
}
private static void StartSecure()
{
RegisterChannel(8081, true, "secure");
RemotingConfiguration.RegisterWellKnownServiceType(typeof(SampleObject2), "Secured.rem", WellKnownObjectMode.Singleton);
}
internal static void MainServer()
{
StartUnsecure();
StartSecure();
Console.WriteLine("Unsecure: 8080\n Secure: 8081");
Console.WriteLine("Press the enter key to exit...");
Console.ReadLine();
}
}
class Program
{
static void Main(string[] args)
{
if (args.Length == 1 && args[0] == "server")
ProgramServer.MainServer();
else
ProgramClient.MainClient();
}
}

编辑:.NET 4 和 VS 2010 没有变化。

最佳答案

这是一个有趣的老式问题,我花了大约一周的时间试图解决这个问题,并且不得不实现一个变通办法。但这是我的发现:答案很可能是:不,你不能。

说明:.NET 远程处理不允许您在创建对象时选择使用哪个客户端 channel 。显然,在服务器端,它会使用监听相关端口的 channel ,但在客户端,它只会使用任何可用端口,甚至创建一个新端口——尽管我总是注册自己的端口。

所以看起来(我无法在文档中的任何地方找到它)如果有可用的安全客户端 channel ,就会使用该 channel 。因此,在问题的示例中,远程对象是针对安全通道创建的,但它期望不安全的 channel - 因此它失败了。如果首先创建一个不安全的连接 - 它之所以有效,是因为在创建远程对象时没有安全的客户端 channel ,因此使用了不安全的客户端 channel 。

解决方法:

  1. 例如,为安全通道创建一个单独的 AppDomain。
  2. 在该 AppDomain 中,创建一个将连接到安全的客户端对象。
  3. 对所有不安全的 channel 使用您的默认 AppDomain。

关于c# - 混合安全和不安全的 channel ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2544660/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com