1

.NET Framework 4 で Windows 認証を使用しているイントラネット ASP.NET MVC3 Web アプリケーションがあります。すべてのコードは、ユーザーの認証に関しては機能しています。ベースライン認証に Windows 認証を使用しており、Active Directory ユーザーを SQL Server 2008 のテーブル内のユーザーにリンクして、アプリケーションに固有の追加のユーザー プロパティを取得しています。そのすべてがうまく機能しています。

管理者が Active Directory ユーザーを選択して SQL ユーザー テーブル (上記参照) に追加し、サイト固有のプロパティ (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 ユーザーを取得する方法を変更する必要がありますか? ありがとうございました!

4

2 に答える 2

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 を使用してカスタム モデルにマップしました。

于 2013-02-23T02:18:53.383 に答える
1

Visual Studio の下で IIS Express を実行すると、IIS 7 の既定のセキュリティ コンテキストで実行するよりもはるかに高いアクセス許可が設定されます。

この方法で Active Directory にクエリを実行するために必要なアクセス許可を正確に理解し、IIS 7 でアプリを実行するアプリケーション プールにその権限があることを確認する必要があります。この操作に必要なアクセス許可のみを付与するように注意してください。続行する前に、これらの権利を付与することの意味をよく確認してください。

于 2013-02-14T21:22:20.970 に答える