7

Windows 認証を使用する ASP.Net MVC アプリケーションがあり、コントローラー アクションのセキュリティのためにグループ メンバーシップをチェックしています。

簡単に聞こえるかもしれませんが、私が経験している問題を解決できる他の質問は見つかりませんでした。

最初の試行: [承認]

古典的な方法は、コントローラー アクションにデータ アノテーション属性を単純に叩きつけAuthorizeて町に行くことです。

[Authorize(Roles = @"domain\groupName1")]

サイコロはありません。資格情報の入力を求められます。通常、これは Windows 認証構成に何か問題があることを意味しますが、セットアップは問題ありません: (1)HttpContext.UserWindowsPrincipalオブジェクトであり、(2) 別の既知のグループ名が機能することを確認しました。

2 回目の試行: IsInRole()

次のステップは、より古い方法で を使用することでした。また、一方が をIPrincipal.IsInRole()返しfalse、もう一方が を返しますtrue

var wp = (WindowsPrincipal)User;

// false
var inGroup1 = wp.IsInRole(@"domain\groupName1");
// true
var inGroup2 = wp.IsInRole(@"domain\groupName2");

困り果てたので、システム オタクに連絡して、すべてを再確認しました。ユーザーはグループのメンバーですか? はい。グループ名のつづりは正しいですか? はい。次のステップは、SID を取得することでした。

3 回目の試行: ID のグループ コレクションの検索

コントローラーWindowsIdentityで、問題のあるグループの SID のグループ コレクションを調べます。

var wi = (WindowsIdentity)wp.Identity;
var group = wi.Groups.SingleOrDefault(g => g.Value == "group1-sidValue");

group変数はオブジェクトSecurityIdentifierです。null ではないため、この現在のユーザーが、[Authorize()]またはの両方のIsInRole()試行で確認に失敗したグループのメンバーであることが確実になります。

4 回目の試行: DirectoryServices.AccountManagement

この時点で、私は夢中になり、AccountManagement API への参照を追加します。GroupPrincipal名前と SIDの両方でドメイン コンテキストを検索します。

   var pc = new PrincipalContext(ContextType.Domain, "domain");
   var gp1byName = GroupPrincipal.FindByIdentity(pc, "groupName1")
   var gp1bySid = GroupPrincipal.FindByIdentity(pc, IdentityType.Sid, "group1-sidValue");

両方のグループ プリンシパル変数は同じオブジェクトで熟しており、監視変数を使用して、プリンシパルのMembersコレクションに現在のonUserPrincipalと同じ SID を持つオブジェクトが含まれていることを確認しました。WindowsPrincipalHttpContext

質問:

ここで一体何を見逃したのですか?ユーザーがこの特定のグループの有効なメンバーであることがオブジェクトの調査によって明白である場合、両方の役割チェック方法が失敗するのはなぜですか?

この時点で、1 つのグループが正常にチェックされ、もう 1 つのグループがチェックされないという事実は、最も奇妙に思えます。

4

2 に答える 2

5

答え:

WindowsIdentity基本的に、これはとNTAccount(これらの System.Security.Principal の両方) と、最後に実際の Active Directory エントリとの間の変換の問題です。

AD に対して を検証するときにWindowsIdentity、Sam または Sid 以外のものを使用する場合は、 を使用する必要がありますSystem.DirectoryServices.AccountManagement

警告: .Net 4.5 では、セキュリティ プリンシパルにクレームが含まれていますが、それは文脈から外れています。


長い説明:

Windows 認証済み Web アプリケーションでHttpContext.UserWindowsPrincipal、基になる をラップするオブジェクトWindowsIdentityです。

WindowsIdentityほとんどの意図と目的のために、認証されたユーザーを識別することができるプロパティは と の 2 つだけNameですUser

これらのプロパティは、ID の対応する AD アカウント エントリの 2 つのプロパティに変換されます。

WindowsIdentity.Name=SamAccountName

WindowsIdentity.User=SID

[Authorize]フィルター属性は最終的に基になるプリンシパルを呼び出します...IsInRole(string role)そして文字列のオーバーロードは(AD エントリの "SamAccountName") を使用して をIsInRole()インスタンス化します。NTAccountrole

これは、上記の #1 と #2 の失敗を説明しています。

HttpContext.User彼/彼女の Sid または SamAccountName 以外に対して承認するにはDirectoryServices.AccountManagement、クラシック LDAP が必要です。

于 2012-10-31T19:21:31.640 に答える
0

Windows 認証を使用する ASP.Net MVC アプリケーションがあり、コントローラー アクションのセキュリティのためにグループ メンバーシップをチェックしています。簡単に聞こえるかもしれませんが、私が経験している問題を解決できる他の質問は見つかりませんでした。何かを見つけるのに多くの時間がかかりました http://www.c-sharpcorner.com/uploadfile/scottlysle/test-for-user-group-membership-in-Asp-Net-C-Sharp/

ユーザーがADグループに属しているかどうかを確認する私のコード:

foreach (System.Security.Principal.IdentityReference group in System.Web.HttpContext.Current.Request.LogonUserIdentity.Groups)
{
     if (String.Equals(group.Translate(typeof(System.Security.Principal.NTAccount)).ToString(), @"your_domain_name\your_group_name", StringComparison.InvariantCultureIgnoreCase))
     {
         // the user belongs to a group 
     }
}

<authentication mode="Windows"/>Web.configファイルの横に必要なのはそれだけです

于 2016-01-21T20:45:28.490 に答える