【问题标题】:How to authenticate computer accounts when using .NET remoting?使用 .NET 远程处理时如何验证计算机帐户?
【发布时间】:2014-10-23 16:47:51
【问题描述】:

我目前正在使用 .NET 远程处理 (C#) 将文件从客户端应用程序复制到服务器应用程序(然后对其进行一些处理)。我可以验证哪个用户帐户连接到服务器并发送文件,但想知道是否有一种方法也可以验证客户端应用程序正在运行的计算机(换句话说,对于这个特定项目,我们同样关心 WHICH COMPUTER 数据是从谁发送来的)。

IAuthorizeRemotingConnection 似乎只为计算机提供了一个 IPEndPoint,因为它只是一个 IP 地址,因此对于验证它并没有真正的帮助。

(我还要提一下,这个程序保证只能在域环境中运行。)

欢迎提出建议!谢谢!

编辑:为澄清起见,我们验证计算机帐户的最终目的是验证它是否是活动目录中特定安全组的成员。我们希望我们的服务器拒绝数据,除非它是从该组中定义的其中一台计算机发送的(尽管任何用户都可以通过这些计算机发送它)。

【问题讨论】:

  • 如果所有计算机都在同一个 Windows 域中,您应该能够使用 SID。 msdn.microsoft.com/en-us/library/windows/desktop/…
  • 我认为如果调用被认证为用户账户,它不会被认证为机器账户。当调用进程作为 NETWORK SERVICE 或 LOCAL SYSTEM 运行时,将使用计算机帐户。它不能同时作为计算机和用户进行身份验证。我可能是错的,但我一直认为它是这样工作的......
  • 如果您将 WCF 与 WS-Trust 一起使用,我认为您可以获得一个安全令牌,其中包含计算机帐户和用户帐户的令牌,方法是使用“ActAs”将一个令牌嵌入另一个令牌中并在客户端机器上使用作为 NETWORK SERVICE 运行的服务,我从未使用过 .Net 远程处理,但我猜它不支持这种行为。
  • 另外,如果您有权访问诸如 Active Directory 证书服务之类的公钥基础结构,也许您可​​以使用证书对计算机进行身份验证。例如,使用计算机证书私钥对请求进行签名。您必须确保客户端上的用户无权访问计算机证书(例如,不是本地管理员)

标签: .net authentication active-directory windows-authentication remoting


【解决方案1】:

我不是高级程序员,但是....

你不能用吗:

http://msdn.microsoft.com/en-us/library/ms143998.aspx

要反向查找 IP 以获取计算机的 DNS 名称,然后使用:

http://msdn.microsoft.com/en-us/library/system.directoryservices.accountmanagement.aspx

确认计算机名存在于 AD 中...

还是太简单了,不够安全?

【讨论】:

  • 首先,感谢您的努力。但你是对的,该解决方案太简单且不安全。
【解决方案2】:

计算机名称只是为了方便,它不是安全对象。因此,Remoting 不努力轻松地检索它。当然,这不是一个真正的问题,您可以简单地公开一个可以在客户端代码中分配的远程属性。但是请记住,如果您实施这样的方案,那么您还需要关闭允许用户欺骗计算机名称的漏洞。改变它很容易,锁定它是模糊的。像 serverfault.com 或 security.stackexchange.com 这样的网站是跟进的最佳地点。

在客户端代码中为其分配 SystemInformation.ComputerName 或 Dns.GetHostName() 的值。在服务器端,您可能想使用 System.DirectoryServices 来发现事实,目前还不清楚您打算用它做什么。

【讨论】:

  • 从客户端接收到的计算机名称和 SID 都不能被信任,不像它们是由受信任的权威机构“签名”的,例如 Active Directory。
  • 当然,我没有隐藏那个细节。如果信任很重要,那么如果安全审查不能保证机器可以被很好地锁定,那么不要使用计算机身份。使用我提到的网站进行跟进。
  • 好吧。那么 Active Directory 如何对计算机进行身份验证?
  • 好的。似乎 AD 正在使用机器密码对计算机进行身份验证:Machine Account Password Process。不过,这并没有多大帮助。
【解决方案3】:

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

创建服务器以通过 TCP 公开远程对象 要创建将充当侦听器以接受远程对象请求的服务器对象,您需要创建通道的一个实例,然后将其注册以供特定端口上的客户端使用。您可以将服务注册为 WellKnownObjectMode.SingleCall,这会为每个客户端生成一个新的对象实例,或者注册为 WellKnownObjectMode.Singleton,这会生成一个用于所有客户端的对象实例。

对于这个例子,创建一个服务器监听器。由于服务需要绑定到可用端口,因此请选择您知道计算机上未使用的端口。 (示例代码使用 8080。)要查看计算机上使用的端口列表,请打开命令提示符并发出命令“netstat -a”。它可能会生成一个长列表,因此请确保将命令提示符缓冲区大小设置为允许滚动。编译类以确保所有内容都正确。

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() 
      {
         // Set up the configuration parameters through a dictionary
         IDictionary properties = new Hashtable();
         properties.Add("port", 8080);
         properties.Add("secure", true);
         properties.Add("impersonate", true);

         // Create an instance of a channel
         TcpServerChannel serverChannel =
            new TcpServerChannel(properties, null);
         ChannelServices.RegisterChannel(serverChannel);

         // Register as an available service with the name HelloWorld
         RemotingConfiguration.RegisterWellKnownServiceType(
            typeof(SampleObject),
            "HelloWorld.rem", 
            WellKnownObjectMode.Singleton );

         Console.WriteLine("Listening on {0}",
                           serverChannel.GetChannelUri());
         Console.WriteLine("Press the enter key to exit...");
         Console.ReadLine();
      }
   }
}

在您的项目中添加对 System.Runtime.Remoting 的引用;否则,将找不到 TcpChannel 和其他相关类。此外,添加对包含 SampleObject 的项目的引用。否则,代码将无法编译,因为它不知道如何找到对 SampleObject 的引用。

要以编程方式保护通信,您需要配置服务器连接。请注意示例代码如何通过 Dictionary 传递参数信息。您可以配置许多附加参数(在 MSDN 上的 VS 2005 Beta Docs 中查找更多参数。)您将在此示例的服务器端使用的参数如下:

port:指定通道将侦听的端口号。 secure:指示通道是否是安全的。 (当受保护时,通道可能需要用户凭据,以及对通信进行加密和签名。如果 TcpServerChannel 是安全的,则 TcpClientChannel 也必须是安全的。否则,不会建立连接。) impersonate:指示服务器是否应模拟客户端。

【讨论】:

  • 这告诉了如何在启用安全性的情况下使用远程处理,但没有回答问题。
  • 感谢您的回答,但它没有回答原始问题。此外,最好提供原始文章的链接:developer.com/net/net/article.php/3522466/…
  • 下次发帖我会记得的
【解决方案4】:

您无法真正验证“计算机”。计算机由不同的硬件组成。您可以做的最好的事情是验证计算机中的某些硬件是否允许与您的应用程序一起使用。

根据this 网站,Windows 会检查 10 种不同硬件的 WPA。如果您编写了客户端应用程序,则让它从计算机中的某种硬件组合中提取信息并将其传递给您的服务器进行身份验证。

【讨论】:

  • 每台加入域的计算机在 AD 中都有一个计算机帐户。这就是我们需要为使用 .NET Remoting 的远程计算机获得的东西
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-19
  • 2017-03-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多