用于检索所有用户的ASP.NET MVC Active Directory代码在部署到IIS 7时停止工作

时间:2013-02-14 21:18:57

标签: c# asp.net-mvc-3 iis-7 active-directory

我有一个内部网ASP.NET MVC3 Web应用程序,它使用.NET身份验证和.NET Framework 4.我的所有代码都在验证用户身份。我使用Windows身份验证进行基线身份验证,然后将Active Directory用户链接到SQL Server 2008中的表中的用户,以获取特定于我的应用程序的其他用户属性。所有这些都很好。

站点中有一部分管理员可以选择要添加到SQL用户表的Active Directory用户(参见上文)并输入他们的站点特定属性(IsAdmin,ShoeSize等)。在此屏幕上,有一个下拉列表,我填充该列表以从我创建的自定义对象中检索所有Active Directory,该对象仅保存Active Directory用户的用户名和全名属性。以下是此代码:

            public IQueryable<ActiveDirectoryUser> ActiveDirectoryUsers
            {
                get
                {
                    // get list of users in the Active Directory
                    DirectoryEntry dirEntry = new DirectoryEntry("WinNT://" + Environment.UserDomainName);
                    List<DirectoryEntry> activeDirectoryUsers = dirEntry.Children.Cast<DirectoryEntry>()
                        .Where(c => c.SchemaClassName == "User").ToList();

                    // populate a custom class I have to hold the active directory user's username and full name property values
                    return activeDirectoryUsers
                        .Where(u => !string.IsNullOrEmpty(u.Properties["FullName"].Value.ToString()))
                        .Select(u => new ActiveDirectoryUser()
                        {
                            NetworkId = String.Format(@"{0}\{1}", Environment.UserDomainName, u.Properties["Name"].Value),
                            FullName = u.Properties["FullName"].Value.ToString()
                        }).AsQueryable();
                }
            }

出于某种原因,当Web应用程序部署到IIS 7时,此代码不会返回任何结果。但是,这在Visual Studio中从IIS Express运行站点时非常有效。有关为什么会发生这种情况的任何想法?我一直在寻找IIS设置作为罪魁祸首,但没有找到任何有用的东西。我是否需要更改检索Active Directory用户的方式?谢谢!

2 个答案:

答案 0 :(得分:2)

此问题最终成为Eric J.回答的组合,以及对获取Active Directory条目的代码的更改。我发现DirectoryEntry方法可以重载以获取用于权限的用户名和密码(例如,您不必依赖IIS运行的任何帐户。这是代码:

               List<SearchResult> searchResults;

                // use login account to access active directory (otherwise it will use the IIS user account, which does not have permissions)
                using (DirectoryEntry root = new DirectoryEntry("LDAP://CN=Users,DC=test,DC=example,DC=com", "usernameCredential", "passwordCredential"))
                using (DirectorySearcher searcher = new DirectorySearcher(root, "(&amp;(objectCategory=person)(objectClass=user))"))
                using (SearchResultCollection results = searcher.FindAll())
                {
                    searchResults = results.Cast<SearchResult>().ToList();
                }

                // get the active directory users name and username
                return searchResults
                    .Select(u => new ActiveDirectoryUser()
                    {
                        NetworkId = String.Format(@"{0}\{1}", this._domainName, u.Properties["sAMAccountName"][0]),
                        FullName = (string) u.Properties["cn"][0]
                    }).AsQueryable();

这允许我获取Active Directory条目,但只有那些是用户和个人对象。然后我用LINQ将它映射到我的自定义模型。

答案 1 :(得分:1)

在Visual Studio中的IIS Express中运行时,您拥有的权限集比在IIS 7的默认安全上下文中运行的权限集要高得多。

您必须准确了解以这种方式查询Active Directory所需的权限,并确保您的应用程序在IIS 7下运行的应用程序池具有此权限。请小心授予此操作所需的权限,并确保在继续操作之前仔细检查授予这些权限的含义。