我应该如何通过SSL验证用户对ADAM实例的凭据?

时间:2009-07-02 11:12:21

标签: c# .net asp.net

事先道歉,因为我以前对目录没有多少经验。

我有一个ASP.net应用程序,我必须针对在Server 2k3上运行的Active Directory应用程序模式实例验证其用户。如果用户的凭据(userPrincipalName& password)错误,我以前尝试与DirectoryEntry建立连接并捕获COMException,但是当我尝试绑定为不是任何ADAM组成员的用户时,我遇到了一些问题(是一项要求)。

我最近找到了System.DirectoryServices.AccountManagement库,这看起来更有前途,但是虽然它可以在我的本地机器上运行,但在我们的测试平台环境中进行测试时遇到了一些麻烦。有可能我只是误解了如何正确使用这些对象,因为我无法找到关于此事的任何好文档。目前,我正在使用Windows用户名和密码创建PrincipalContext,然后使用用户的 userPrincipalName和密码调用AuthenticateCredentials。这是我正在做的非常短暂的努力:

using (var serviceContext = new PrincipalContext(
    ContextType.ApplicationDirectory,
    serverAddress,
    rootContainer,
    ContextOptions.Negotiate | ContextOptions.SecureSocketLayer,
    serviceAccountUsername,
    serviceAccountPassword)) {
bool credentialsValid = serviceContext.ValidateCredentials(userID, password, ContextOptions.SecureSocketLayer | ContextOptions.SimpleBind)
}

如果用户的凭据有效,我继续使用该主要上下文执行其他操作。正如我所说,这适用于在我自己的环境中有角色和没有角色的用户,但不适用于我们的测试平台环境。我的旧DirectoryEntry检查用户凭据的方式仍然使用相同的配置。

1 个答案:

答案 0 :(得分:1)

经过一个漫长的早晨,我能够找出问题所在!

我在调用ValidateCredentials时收到的异常消息非常模糊。在测试环境中安装Visual Studio 2008(在国家的另一边,请注意!),我能够调试并检索错误的HRESULT。在对Google进行了一些非常深入的搜索之后,我发现了一些关于“SSL警告”的非常模糊的评论被认为是其他例外情况,并且启用“SCHANNEL日志记录”(我非常不熟悉!)可能会揭示更多的洞察力。因此,在注册表中重新启动并重试连接之后,我看到了这个:

  

从远程服务器收到的证书不包含预期的名称。因此无法确定我们是否连接到正确的服务器。我们期待的服务器名称是ADAMServer。 SSL连接请求失败。附加的数据包含服务器证书。

我觉得这很奇怪,因为通过SSL连接的方法运行正常。在任何情况下,我的同事都能够发现问题 - 在服务器上发布的SSL证书上的名称是DNS名称(“adam2.net”)的名称而不是主机名(“adamserver”) )。虽然我被告知这是常态,但在使用PrincipalContext时它只是没有解析正确的名称。

长话短说;重新颁发带有计算机名称而不是DNS名称的证书可以解决问题!