1

我正在尝试创建一个 Intranet 网站,该网站可以根据他们的 Active Directory 用户名查找用户的电子邮件地址。

我的 web.config 中有以下内容:

<authentication mode="Windows"/>
<identity impersonate="true"/>

我可以通过以下方式获取用户用户名:

Environment.UserName

在 localhost 上运行,以下代码允许我查询 AD 并获取电子邮件:

public string GetADUser(string userName)
{            
    DirectoryEntry entry = new DirectoryEntry();

    // get a DirectorySearcher object
    DirectorySearcher search = new DirectorySearcher(entry);

    // specify the search filter
    search.Filter = "(&(objectClass=user)(anr=" + userName + "))";

    // specify which property values to return in the search  
    search.PropertiesToLoad.Add("mail");    // smtp mail address

    // perform the search
    SearchResult result = search.FindOne();

    string email = string.Empty;

    if (result != null)
    {
        if (result.Properties["mail"].Count == 1)
        {
            email = result.Properties["mail"][0].ToString();
        }
        else
        {
            email = "no email";
        }
    }
    else
    {
        email = "not found";
    }

    return email;
}

太好了,此代码默认使用我的凭据进行身份验证,并允许我传入用户名并查找用户的电子邮件地址。

但是,当我将此测试代码上传到服务器时,如果我从本地主机以外的任何地方浏览到该站点,代码就会停止工作。

[COMException (0x80072020): An operations error occurred.]

谷歌搜索表明我有权限问题。

为了解决这个问题,我尝试将应用程序池标识设置为我的凭据,但这仍然不允许代码搜索 AD。

网站身份验证在 IIS 中配置如下(启用的项目标记为 <<):

Anonymous Authentication:Disabled
ASP.NET Impersonation:Enabled  <<
Basic Authentication:Disabled
Digest Authentication:Disabled
Forms Authentication:Disabled
Windows Authentication:Enabled  <<

甚至有可能做我想做的事吗?我错过了什么?

4

1 回答 1

2

好的,我发现了问题。

在这种情况下,ASP.NET Impersonation:EnabledIIS 和我的 Web.Config 与我配置的应用程序池标识冲突。(我认为)。

一旦我将应用程序池身份设置为使用经过身份验证以查询 AD 的适当帐户运行,禁用模拟并离开,Windows Authentication:Enabled我就能够让网站查询 AD,而无需在我的代码中传递任何凭据。

于 2013-03-11T15:03:18.923 回答