我使用控制台应用程序编写一些测试代码:
/// <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:
答案 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");