我有一个.NET 2.0远程处理应用程序需要在可能位于不同域或根本没有域的计算机之间进行通信。它正在使用TCP通道。
一切正常,直到我启用加密,然后在连接时我收到错误“服务器已拒绝客户端凭据”。我做了很多搜索,但我找不到适用于我的解决方案。
我尝试过使用各种频道设置并且没有取得任何成功。
我的远程处理对象有自己的内置身份验证,因此我不需要Windows进行任何类型的身份验证。
Botton line问题是:
“我可以在没有Windows尝试验证客户端凭据的情况下在.NET远程TCP通道上启用加密吗?”
答案 0 :(得分:4)
首先,使用“secure”属性/参数保护服务器和客户端通道。然后,在客户端将用户名和密码设置为空字符串。
IDictionary properties = new Hashtable();
properties["username"] = "";
properties["password"] = "";
// Set other properties here
IClientChannelSinkProvider provider = new BinaryClientFormatterSinkProvider();
channel = new TcpClientChannel(properties, provider);
ChannelServices.RegisterChannel(channel, true);
在这种情况下,客户端以匿名用户身份(NT AUTHORITY \ ANONYMOUS LOGON)连接到服务器,并且只要我监视客户端和服务器之间的通信,它就会被加密。
问题问题已经有很长时间了,.NET Remoting有点被弃用,但我发现它很有用,也可以帮助其他人。
答案 1 :(得分:0)
经过相当多的研究后,我得出的结论是,如果没有使用.NET远程处理的一些主要自定义编码,就无法做到这一点。
我决定将项目移动到WCF,它允许使用SSL而不管任何类型的身份验证。搬到WCF后,一切都像魅力一样。
答案 2 :(得分:0)
我相当确定大多数人已经转向 WCF,但我想提出对我有用的解决方案,并希望对那些在 .net 远程处理方面苦苦挣扎的人有用。要求是能够通过当前的 .net 远程实现与在不同域中运行的另一个 Windows 服务进行通信。我知道我必须使用模拟。我尝试了 Mehrzard 的解决方案无济于事。连接似乎没有使用我设置的凭据。然后我找到了 this article 并解决了我的问题。我能够进一步设置凭据。
IMyRemoteObject myObj = (IMyRemoteObject )
Activator.GetObject(
typeof(IMyRemoteObject ),
CreateConnectionString());
IDictionary props = ChannelServices.GetChannelSinkProperties(myObj );
props["username"] = "Administrator";
props["password"] = "xyz";
props["domain"] = "TestDomain";
//call the remote object
MessageBox.Show(myobj.hello());