web-dev-qa-db-ja.com

C#を使用してASP.Net MVCからActive Directoryにアクセスする

顧客が所属するグループに関する情報を取得するには、Active Directoryにアクセスする必要があります。私が持っているプロジェクトは、C#を使用したASP.Net MVCアプリケーションです。私はこれまでにActive Directoryに対してプログラミングしたことがなく、情報をアクセスするためにどのセキュリティモデルを使用するのが最善の方法であるかについてアドバイスが必要です。

24
Russ Clark

MVCを使用しているため、.NET 3.5の新しい System.DirectoryServices.AccountManagement 名前空間にアクセスできます。これらのクラスは、使用がはるかに簡単であるため、DirectoryServices自体の古いクラスよりも優先する必要があります。 3.5で解決されていない落とし穴がいくつかありますが(たとえば、グループをクエリする場合のメンバー制限は1500)、これらは.NET 4.0で修正されていると確信しています。ほとんどのタスクでは、新しいクラスは非常にうまく機能します。

 using (var context = new PrincipalContext( ContextType.Domain )) 
 {
      using (var user = UserPrincipal.FindByIdentity( context, "username" ))
      {
          var groups = user.GetAuthorizationGroups();
          ...
      }
 }
47
tvanfosson

使用する - System.DirectoryServices ADにアクセスするためのネームスペース。

最も重要な2つのクラスは次のとおりです。

  1. DirectoryEntry ;
  2. DirectorySearcher

ドメインがMyIntranet.MyCompany.comであるとします。

次に、DirectoryEntryクラスのルートインスタンスを作成する必要があります。

DirectoryEntry root = new DirectoryEntry("LDAP://DC=MyIntranet,DC=MyCompany,DC=com");

ADでグループまたはユーザーの特定の発生を検索する場合:

DirectorySearcher searcher = new DirectorySearcher();
searcher.SearchRoot = root;
searcher.SearchScope = SearchScope.Subtree;

AnyUser1という名前のユーザー名を検索するとします。DirectorySearcher.Filterは次のようになります。

searcher.Filter = string.Format("(&(objectCategory=person)(objectClass=user)(sAMAccountName={0})", "AnyUser1");

次に、次のように SearchResult クラスを使用して結果を取得します。

bool userFound = false;
SearchResult foundUser = null;

try {
    foundUser = searcher.FindOne(); // You might as well use the FindAll() method if you expect more then one result.
    userFound = foundUser != null;
} catch(Exception) {
    throw;
}

if (!userFound)
    return;

DirectoryEntry user = foundUser.GetDirectoryEntry();

次に、このユーザーがメンバーとなっているグループをmemberOfプロパティを介して取得できます。

user.Properties("memberOf").Value

概要については、CodeProjectの記事 (ほとんど)Active Directoryのすべての方法 を参照してください。

プロパティのリスト: IADsUserプロパティとActive Directory属性の間のマッピング

EDIT#1

偽装を使用している場合は、DefaultRootDomainDefaultUserNameDefaultPasswordを使用して、ルートDirectoroEntryをインスタンス化するときにそれらを使用します。

public static class AdHelper {

    public static string DefaultRootDse {
        get {
            return Properties.Settings.Default.DefaultRootDomain;
        }
    }

    private static string DefaultUserName {
        get {
            return Properties.Settings.Default.DefaultUserName;
        }
    }

    private static string DefaultPassword {
        get {
            return Properties.Settings.Default.DefaultPassword;
        }
    } 

    public static DirectoryEntry RootDse {
        get {
            if (_rootDse == null)
                _rootDse = new DirectoryEntry(DefaultRootDse, DefaultUserName, DefaultPassword);
            return _rootDse;
        }
    }
    private static DirectoryEntry _rootDse;
}
13

.NET 3.5をお持ちの場合、または.NET 3.5にアップグレードできる場合-System.DirectoryServices.AccountManagement!の新機能をぜひご利用ください。

詳細とジャンプスタートについては、MSDNマガジンのすばらしい紹介記事 。NET Framework 3.5でのディレクトリセキュリティプリンシパルの管理 を参照してください。

0
marc_s

なぜSystem.Web.Securityではないのですか? 2.0フレームワークにもありました

すなわち: http://msdn.Microsoft.com/en-us/library/system.web.security.activedirectorymembershipprovider(v = vs.85 )そして現在はフレームワーク4.0にあります: http ://msdn.Microsoft.com/en-us/library/system.web.security.activedirectorymembershipprovider(v = vs.1

0