質問:
C# で、ライブラリや厄介な LDAPを使用せずに Active Directory グループ SID を検索する方法はありますか?DirectoryServices.AccountManagement
[更新] -- なぜ私が尋ねているのか:
[Authorize]
属性と基礎となるものは、ADWindowsPrincipal.IsInRole(string role)
に対してのみチェックされます。samAccountName
これは、Microsoft がロールをチェックするときに避けることを提案している従来の識別子であるだけではありません。
// It is also better from a performance standpoint than the overload that accepts a string.
// The aformentioned overloads remain in this class since we do not want to introduce a
// breaking change. However, this method should be used in all new applications and we should document this.
public virtual bool IsInRole (SecurityIdentifier sid) {}
しかし、AD を制御することもできず、samAccountName が、セットアップを要求する「ユーザー フレンドリ」な名前と同期していることを保証できません。これが、単数形 (samAccountName) 文字列ではなく複数形 (Name) を渡すという問題が最初に発生した理由です...値が同じではありませんでした。
また、samAccountName と SID は変更される可能性があります。たとえば、AD 管理者がアカウントを削除して再作成した場合、SID は確実に異なり、samAccountName は人的エラーの別の場所になりますが、常に名前を復元します。要求された /UPN 値。
最終的には、SAM や SID をハードコーディングせずにグループ メンバーシップをチェックするために、独自のクリーンな authorize 属性を作成したいと考えています。
DirectoryServices.AccountManagement でこれを実行できることはわかっています。
// get group principal
var pc = new PrincipalContext(ContextType.Domain, "domainName");
var gp = GroupPrincipal.FindByIdentity(pc, IdentityType.Name, "groupName");
// check if user is in group.
var up = UserPrincipal.Current;
var usersGroups = up.GetGroups();
var inGroup = usersGroups.Contains(gp);
プログラムされる属性を可能な限りスリムに保つために、これを行うためのより簡単で、依存度が低く、レガシーではない方法があるかどうかを知りたかっただけです。
以前の関連する質問: Active Directory Group Membership Checking in .Net 4.5