我有一个网络应用程序(.NET 3.5),它通过电子邮件向用户发送通知。为此,我搜索Active Directory以查找每个人的电子邮件。
目前,我正在硬编码我自己的用户名和密码,以便搜索AD:
Dim entry As New DirectoryEntry("LDAP://companyad", "myUsername", "myPassword", AuthenticationTypes.Secure)
Dim srch As New DirectorySearcher(entry)
srch.Filter = [String].Format("(&(objectClass=person)(sAMAccountName={0}))", "someOtherUsername")
Dim result As SearchResult = srch.FindOne()
现在,显然,这并不理想,我不希望这些凭证硬编码。我的网络应用程序使用Windows身份验证。它还使用模拟(作为登录用户)来访问文件和SQL Server。是否还有一种方法让我“模仿”登录用户以搜索AD?
编辑1
我想我最好解释为什么选择这个答案。问题结果不是多跳问题或kerberos,因为我似乎已经正确设置了这些。
我最近将我的应用更改为仅允许通过web.config设置访问某个组。我之前只允许访问自己。我成立了这个小组并加入了自己的行列。然后,我删除了硬编码的凭据,并尝试在不重新启动计算机的情况下运行应用程序。
根据我的网络管理员的说法,在我重新启动计算机之前,我不会登录该新组,我认为这是导致我的问题的原因。所以,Preet的答案实际上是最准确的,因为我只需要将LDAP路径传递给DirectoryEntry。
编辑2
我还需要注册服务主体名称。
我跑了这个:
setspn -A HTTP/[dns name of the site] [machine name]
在我的开发机器上。
感谢其他人的回答。
答案 0 :(得分:0)
不
Dim entry As New DirectoryEntry("LDAP://companyad")
工作?
答案 1 :(得分:0)
为什么不单独为此目的创建新用户?仅具有搜索权限的用户。
答案 2 :(得分:0)
我设置< identity impersonate =“true”/>在我的web.config中,将以下代码添加到我的页面加载事件处理程序中。它工作正常。你确定你没有处理多跳情况吗?在这种情况下,您的应用程序池帐户需要配置为kerberos身份验证,以支持多跳场景中的模拟。有关这方面的更多信息,请访问:http://support.microsoft.com/kb/329986
Response.Write(User.Identity.Name);
DirectoryEntry entry = new DirectoryEntry("LDAP://[mydomain.net]");
DirectorySearcher srch = new DirectorySearcher(entry);
srch.Filter = string.Format("(&(objectClass=person)(sAMAccountName={0}))", "[user]");
SearchResult result = srch.FindOne();
Response.Write(result.Path);
答案 3 :(得分:0)
如果您希望使用Windows登录用户帐户作为AD的凭据,则必须使用以下内容:
public bool IsExistingUser() {
DirectoryEntry de = new DirectoryEntry(Environment.UserDomainName)
DirectorySearcher ds = new DirectorySearcher(de)
ds.Filter = string.Format("((objectClass=user)(SAMAccountName={0}))", Environment.UserName)
try
SearchResult sr = ds.FindOne();
if (sr != null && sr.DirectoryEntry.Name.Contains(Environment.UserName))
return true;
catch (DirectoryServicesCOMException ex)
catch (COMException ex)
throw new Exception("Can't find logged in user in AD", ex);
return false;
}
假设此代码将编译并运行,它将验证您的域控制器是否知道现有登录用户。
不鼓励假冒,因为它允许在您的网络中传输密码字符串。所以,尽量避免使用它。
编辑这是AD非常有用的链接:Howto: (Almost) Everything In Active Directory via C#我发现此帖很棒!