【问题标题】:C# verify user in Active Directory from Socket conectionC# 从 Socket 连接验证 Active Directory 中的用户
【发布时间】:2014-10-23 19:40:10
【问题描述】:

我从一开始就是 .Net 开发人员。但最后一次很有趣。我为自己的目的编写了一个网络基础 dll 并开始编写合适的 iOS 客户端应用程序。一切正常,但现在我有点想自己不管理用户数据,而是使用 Active Directory 的现有数据。将纯文本用户名和密码从应用程序发送到服务器然后进行验证不会有任何问题,但这并不像我想要的那样安全。我个人最喜欢的方式是:

  1. 将用户名从应用程序发送到服务器
  2. 通过用户名和挑战从 AD 获取挑战密码哈希
  3. 向客户发送挑战
  4. 对密码进行哈希处理
  5. 将哈希发送回服务器并检查哈希是否匹配

非常简单直接的方式。我不必处理证书并且可以提供基本的安全性。我知道,在现代,这不是最安全的方式。但这足以满足我的需要。

我的问题是,有没有办法从广告中获取用户的散列密码,我是否会收到挑战?或者有没有其他简单的方法来提供一种简单安全的方法来验证不在本地网络中的用户?

非常感谢您

最好的问候 弗洛里安

【问题讨论】:

    标签: c# security sockets active-directory


    【解决方案1】:

    您是否尝试过使用 System.DirectoryServices.AccountManagement?验证登录非常简单:

    bool authenticated;
    using (PrincipalContext domainContext = new PrincipalContext(ContextType.Domain, domain))
    {
        authenticated = domainContext.ValidateCredentials(username, password);
    }
    

    【讨论】:

    • 非常感谢您的回答。就是这样,我将验证我在本地拥有凭据的用户。但要获得这些凭据,我需要通过不安全的套接字连接传输它们。我不想将密码作为纯文本传输。这就是为什么我要实现上述方式。
    【解决方案2】:

    正如您所说,这应该是基本身份验证,但无需通过网络发送纯密码。因此,我建议使用非对称加密的解决方案。

    在客户端加密密码并将加密的消息发送到服务器。服务器是唯一拥有私钥的服务器,因此可以读取密码并使用PrincipalContexts ValidateCredentials 方法验证它(就像 itsme86 建议的那样)。

    因此,您的应用程序的步骤可能是:

    1. 请求从应用到服务器的公钥
    2. 从服务器获取公钥
    3. 用公钥加密密码
    4. 将加密后的密码连同用户名一起发回服务器
    5. 服务器解密凭据并根据 AD 验证它们

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-15
      • 2017-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多