我正在开发一个SharePoint 2010 Web部件(在C#中),它需要从Active Directory中提取用户数据,但是我无法使用当前SharePoint用户的凭据来通过AD进行身份验证。我正在使用DirectoryEntry类从AD获取数据,当我对某些凭据进行硬编码时它工作正常,但我知道这是不好的做法所以我想避免它。我尝试过几个不同的事情:
new DirectoryEntry("LDAP://" + dc, null, null, AuthenticationTypes.ServerBind | AuthenticationTypes.FastBind);
和
new DirectoryEntry("LDAP://" + dc, null, null, AuthenticationTypes.Secure);
但他们都只是抛出异常。我真的不知道这些是做什么的,但这是我在网上找到的。
任何有助于我指明正确方向的帮助都将非常感激。
答案 0 :(得分:2)
你可能遇到了臭名昭着的“双跳”问题。 Sharepoint Server无法自动验证您到另一台服务器,即使在同一个域上也是如此。关于这个问题的更多信息,谷歌“双跳”。
有多种选择可以做你想要的事情:
您可以使用Sharepoint 2010中的Secure Store Service存储连接到AD的必需用户名/密码,可以是所有Sharepoint用户共享的单个用户名/密码(类似于下面的#2)或用户名/每个Sharepoint用户的密码(类似于下面的#3)。
您可以设置对AD具有只读权限的AD帐户,然后创建一些Web部件属性以存储用户的用户名和密码。设置属性,以便所有用户共享并由管理员设置。连接到AD时使用存储的用户名/密码。设置password属性,使其从UI端以只写方式显示。
如果每个用户根据用户在AD中的权限查看不同的AD数据集很重要,那么您可以执行与上述类似的操作,但不要共享用户名/密码属性。
为您的Sharepoint环境设置Kerberos,从而允许sharepoint Web服务器在您向AD进行身份验证而无需存储您的凭据
设置AD以允许匿名读取访问(出于安全考虑,可能不是最好的)
答案 1 :(得分:0)
我正在使用此代码与当前用户连接到AD:
using (DirectoryEntry entry = new DirectoryEntry())
{
using (DirectorySearcher searcher = new DirectorySearcher(entry))
{
searcher.Filter = "yourSearchQuery";
searcher.PropertiesToLoad.Add("yourProperty1");
searcher.PropertiesToLoad.Add("yourProperty2");
using (SearchResultCollection results = searcher.FindAll())
{
foreach (SearchResult result in results)
{
using (DirectoryEntry resultEntry = result.GetDirectoryEntry())
{
PropertyValueCollection valuesForProperty1 = resultEntry.Properties["yourProperty1"];
PropertyValueCollection valuesForProperty2 = resultEntry.Properties["yourProperty2"];
// ...
}
}
}
}
}