2012-04-25 10 views
0

SQL Serverでは、アイテムとアクティブディレクトリグループとの間に多対多の関係があります。私は、提供されたアクティブディレクトリユーザーに基づいて、ユーザーがグループのメンバーである場合、アクティブディレクトリグループに関連付けられているすべてのアイテムを照会することができるクエリを作成します。SQL Server:ロールメンバーシップの確認

私はIS_Memberを使用する道を辿りましたが、現在接続されているユーザーにしか動作しません。ストアドプロシージャは、現在特定のSQLユーザーアカウントに接続しているasp.net Webアプリケーションによって呼び出されます。私は私のインフラストラクチャの設定がユーザーのマシンから、Webサーバーを介して、次にdbサーバー(3ホップの問題)を許可することを承知していないので、Webアプリケーションで統合認証と偽装を使用して接続できるとは思わない。

ここでは何ができますか?

+0

あなたが試みることができる1つのことは、CLRストアドプロシージャを書くことです。次に、WindowsIdentityを使用して、グループメンバーシップまたはすべてのユーザーのS4Uチェックを実行できます。 –

答えて

1

ADを照会し、データベース内のすべてのユーザー/グループを含むテーブルを作成し、毎日実行するSQLジョブから呼び出すC#またはVB.NET .exeを作成します。次に、同期されたテーブルのデータを使用して比較を行います。このようにして、その場でそれをやろうとする他のすべての複雑さを避けることができます。グループメンバーシップは頻繁に変更されません。 ADで何か変更された場合でも、手動で "同期ジョブ"を実行するだけでOKです。 Windows.Identity()を使用するか、ASP.NETからのものであれ、ユーザー名を確認することができます。

0

あなたが説明する問題は古典的なダブルホップのシナリオです。(最終的には)ケルベロス構成と呼ばれる手間のかかるプロセスによって解決できます。 lazier回避策は、asp.netアプリケーションからの資格情報を変数としてデータベースのSQLクエリに渡すことです。

SQL ServerにリンクサーバーとしてLDAPサーバーが構成されている場合は、ストアドプロシージャを書き換えてユーザーを入力変数として受け入れることができ、次に進む前にユーザーがADグループのメンバーであるかどうかを確認できます。以下に示すように、あなたのストアドプロシージャにOPENQUERYを組み込む考えてみましょう:

CREATE PROCEDURE CheckAccess 
@CurrentUser varchar(max) 
AS 
IF @CurrentUser IN 
(
SELECT CN 
FROM OPENQUERY(ADSI,'<LDAP://DC=Your,DC=DomainComponent,DC=com>;(&(CN=*) 
(memberOf=CN=YourADGroupName,OU=Your,OU=OrganizationalUnit,OU=Name,DC=Your,DC=DomainComponent,DC=com));CN') 
) 
THEN 
SELECT 'Authorized User' 
ELSE 
SELECT 'Unauthorized User' 
END 

あなたは、あなたがOPENQUERYを微調整するために、グループの正しいdomainComponentsとorganizationalUnitsを得ることを確認するためにLDAPの管理者に相談することができます。これの欠点の1つは、メンバーシップのサイズに応じてADグループを照会するのに時間がかかることです。それは痛みですが、アプリケーションが変数としてユーザーを渡すことができる限り、OPENQUERYを活用したり、sys.database_principalsにクエリしてアクセスを確認することもできます。

関連する問題