Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何验证用户';是否通过SSL针对ADAM实例设置凭据?_C#_.net_Asp.net - Fatal编程技术网

C# 如何验证用户';是否通过SSL针对ADAM实例设置凭据?

C# 如何验证用户';是否通过SSL针对ADAM实例设置凭据?,c#,.net,asp.net,C#,.net,Asp.net,请提前道歉,因为我以前对目录没有太多经验 我有一个ASP.net应用程序,我必须根据运行在服务器2k3上的Active Directory应用程序模式实例验证其用户。我以前曾尝试与DirectoryEntry建立连接,如果用户的凭据(userPrincipalName和密码)错误,则捕获COMException,但我在尝试绑定为非任何ADAM组成员的用户时遇到了许多问题(这是一项要求) 我最近发现了这个库,它看起来更有希望,但尽管它在我本地的机器上工作,但在我们的测试环境中测试它时,我遇到了一些

请提前道歉,因为我以前对目录没有太多经验

我有一个ASP.net应用程序,我必须根据运行在服务器2k3上的Active Directory应用程序模式实例验证其用户。我以前曾尝试与DirectoryEntry建立连接,如果用户的凭据(userPrincipalName和密码)错误,则捕获COMException,但我在尝试绑定为非任何ADAM组成员的用户时遇到了许多问题(这是一项要求)

我最近发现了这个库,它看起来更有希望,但尽管它在我本地的机器上工作,但在我们的测试环境中测试它时,我遇到了一些麻烦。很可能我只是误解了如何正确使用这些对象,因为我找不到关于这个问题的任何优秀文档。目前,我正在使用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检查用户凭据的方法在相同的配置下仍然有效。

经过一个漫长的上午,我终于找到了问题所在

调用ValidateCredentials时收到的异常消息非常模糊。在测试环境中安装VisualStudio2008之后(请注意,它位于美国的另一边!),我能够调试并检索错误的HRESULT。在对谷歌进行了一些非常深入的搜索之后,我发现了一些非常模糊的评论,关于“SSL警告”被当作其他例外,而启用“SCHANNEL日志”(我非常不熟悉!)可能会揭示出更多的见解。因此,在注册表中打开该选项并重试连接后,我收到了以下信息:

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

我发现这相当奇怪,因为通过SSL连接的旧方法工作得很好。在任何情况下,我的同事都能够发现问题——在服务器上颁发的SSL证书上的名称是DNS名称(“adam2.net”),而不是主机名(“adamserver”)。虽然我被告知这是标准,但在使用PrincipalContext时,它并没有解析正确的名称


长话短说;重新颁发计算机名而不是DNS名的证书修复了此问题

经过一个漫长的上午,我终于找到了问题所在

调用ValidateCredentials时收到的异常消息非常模糊。在测试环境中安装VisualStudio2008之后(请注意,它位于美国的另一边!),我能够调试并检索错误的HRESULT。在对谷歌进行了一些非常深入的搜索之后,我发现了一些非常模糊的评论,关于“SSL警告”被当作其他例外,而启用“SCHANNEL日志”(我非常不熟悉!)可能会揭示出更多的见解。因此,在注册表中打开该选项并重试连接后,我收到了以下信息:

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

我发现这相当奇怪,因为通过SSL连接的旧方法工作得很好。在任何情况下,我的同事都能够发现问题——在服务器上颁发的SSL证书上的名称是DNS名称(“adam2.net”),而不是主机名(“adamserver”)。虽然我被告知这是标准,但在使用PrincipalContext时,它并没有解析正确的名称

长话短说;重新颁发计算机名而不是DNS名的证书修复了此问题