English 中文(简体)
在ASP.NET中访问Active Directory?
原标题:
  • 时间:2008-12-08 19:44:36
  •  标签:

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

    /// <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:

The authentication mechanism is unknown.

问题回答

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

如果它是一个使用Windows身份认证的内部网络应用程序,则您可以将AD调用包装在用户的模拟上下文中。

有那么一种感觉:

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

或者您可以在web.config中指定identity impersonate = true,这样发送到Active目录的请求将作为调用用户而不是MachineASPNET。

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

如有可能,请前往计算机的AD属性,选择委派选项卡,并选择“信任此计算机委派给任何服务(仅限Kerberos)”。

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

只信任将特定服务委托给此计算机。

然后选择“仅使用Kerberos”。

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

The easiest way around this is to make your web application pool run as a domain account that has the required access. This avoids you having to manage the secure storing of a password. Don t forget to make the account a member of the IIS_WPG local group. If you do decide to use impersonation you will have to configure Kerberos delegation as well as changing the ASP.NET configuration to impersonate. This will involve making the application pool run as a domain account, granting that domain account permission to delegate credentials (the delegation tab of the account properties in the AD users and computers MMC). Then ensuring that the website is set to use negoiate in the metabase (this is the default on IIS6, not sure about other versions) and registering an SPN for the new domain account.

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

你也可以尝试将域名包含在登录中。

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




相关问题
热门标签