在ASP.NET中访问Active Directory?

时间:2008-12-08 19:44:36

标签: asp.net active-directory credentials

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

    /// <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://域连接字符串是不够的,因为它需要实际的登录名/密码。因为它运行在计算机上的本地帐户上,所以我不确定要使用哪个AD L / P.我可以以某种方式将访问用户帐户委托给他吗?

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

身份验证机制未知。

5 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

发送

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

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

看看是否有效。如果是这样,您可以使用表示

的第三个选项进一步细化权限

“信任此计算机以仅委派给指定的服务”

然后选择“仅使用Kerberos”

并在“此帐户可向其提供委派凭据的服务”中添加相关服务信息。

答案 2 :(得分:1)

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

类似的东西:

using (((System.Security.Principal.WindowsIdentity)User.Identity).Impersonate())
{
    // Do your AD stuff here
}

答案 3 :(得分:1)

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

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

答案 4 :(得分:1)

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

adSharepointUsers = new DirectoryEntry("LDAP://MyDomain","MyDomain/ADUser","password");