6

我使用控制台应用程序编写一些测试代码:

    /// <summary>
    /// Returns AD information for a specified userID.
    /// </summary>
    /// <param name="ntID"></param>
    /// <returns></returns>
    public ADUser GetUser(string ntID)
    {            
        DirectorySearcher search = new DirectorySearcher();         
        search.Filter = String.Format("(cn={0})", ntID);
        
        search.PropertiesToLoad.Add("mail");
        search.PropertiesToLoad.Add("givenName");
        search.PropertiesToLoad.Add("sn");
        search.PropertiesToLoad.Add("displayName");
        search.PropertiesToLoad.Add("userPrincipalName");            
        search.PropertiesToLoad.Add("cn");

        SearchResult result = search.FindOne();

        return new ADUser(result);
    }

这在控制台应用程序中运行良好。但是,当我将其移至 ASP.NET 应用程序时,我收到一条关于不知道正确域的错误消息。

在 ASPNET 帐户上运行时访问 AD 是否缺少技巧?

编辑:仅传递一个 LDAP://domain 连接字符串是不够的,因为它需要一个实际的登录名/密码。因为它在机器上的本地帐户上运行,所以我不确定要使用什么 AD L/P。我可以以某种方式将访问用户帐户委托给此吗?

编辑#2:当尝试使用身份模拟时,我得到一个 DirectoryServicesCOMException :

身份验证机制未知。

4

5 回答 5

1

是的。您需要给它一个目录连接字符串。控制台应用程序(以您的身份运行)使用您的凭据运行,包括目录访问权限。ASP.NET 应用程序使用 ASPNET 用户的凭据运行,这些凭据对于运行应用程序的系统是本地的,而不是目录全局的。

于 2008-12-08T19:47:22.273 回答
1

或者,您可以在 web.config 中指定 identity impersonate=true 并且对 Active Directory 的请求将作为调用用户而不是 Machine\ASPNET 发送

编辑:如果您收到身份验证错误,请参阅 PIPTHEGEEK 的帖子,您将不得不信任您的 Web 服务器进行委派,但是要小心信任委派(因为它会打开另一罐针对安全类型的蠕虫)。您必须允许 Web 服务器将当前用户的凭据传递给 AD。

如果可能,请转到计算机的 AD 属性,选择委派选项卡,然后选择“信任此计算机以委派给任何服务(仅限 Kerberos)

看看这是否有效。如果是这样,您可以使用第三个选项进一步细化权限

“信任这台计算机仅委派指定的服务”

然后选择“仅使用 Kerberos”

并在“此帐户可以提供委托凭证的服务”中,添加相关服务信息。

于 2008-12-08T19:51:13.967 回答
1

如果它是使用 Windows 身份验证的 Intranet 应用程序,那么您可以将 AD 调用包装在用户的模拟上下文中。

就像是:

using (((System.Security.Principal.WindowsIdentity)User.Identity).Impersonate())
{
    // Do your AD stuff here
}
于 2008-12-08T19:57:35.527 回答
1

解决此问题的最简单方法是让您的 Web 应用程序池作为具有所需访问权限的域帐户运行。这避免了您必须管理密码的安全存储。不要忘记使该帐户成为 IIS_WPG 本地组的成员。如果您决定使用模拟,则必须配置 Kerberos 委派以及将 ASP.NET 配置更改为模拟。这将涉及使应用程序池作为域帐户运行,授予该域帐户委派凭据的权限(AD 用户和计算机 MMC 中帐户属性的委派选项卡)。然后确保网站设置为在元数据库中使用 negoiate(这是 IIS6 上的默认设置,不确定其他版本)并为新域帐户注册 SPN。

编辑:您的“未知身份验证”错误听起来像是错误配置的委派。检查您的应用程序池正在运行的帐户是否受委派信任,IIS 是否设置为仅使用 Windows 身份验证,以及是否为应用程序池身份帐户注册了有效的 SPN。

于 2008-12-08T19:58:20.737 回答
1

您也可以尝试在登录中包含域

adSharepointUsers = new DirectoryEntry("LDAP://MyDomain","MyDomain/ADUser","password");
于 2011-06-27T12:33:48.497 回答