0

SQL Serverでは、アイテムとActiveDirectoryグループの間に多対多の関係があります。提供されたActiveDirectoryユーザーに基づいて、ユーザーがグループのメンバーである場合にActiveDirectoryグループに関連付けられているすべてのアイテムをクエリできるクエリを作成したいと思います。

IS_Memberを使用する道を進みましたが、これは現在接続しているユーザーに対してのみ機能します。ストアドプロシージャは、現在特定のSQLユーザーアカウントに接続しているasp.netWebアプリによって呼び出されます。Webアプリで統合認証と偽装を使用して接続できるとは思いません。インフラストラクチャ構成により、ユーザーマシンから、Webサーバーを経由して、dbサーバーに委任できるとは思わないからです(3ホップの問題)。 。

ここで何ができますか?

4

2 に答える 2

1

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

于 2012-04-26T01:52:09.757 に答える
0

あなたが説明する問題は、Kerberos 構成として知られている骨の折れるプロセスによって (最終的には) 解決できる、古典的なダブルホップ シナリオです。怠惰な回避策には、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

可能であれば、LDAP 管理者に相談して、OPENQUERY を調整するためのグループの正しい domainComponents と organizationUnits を取得してください。これの欠点の 1 つは、明らかにメンバーシップのサイズによっては、AD グループのクエリに時間がかかることです。面倒かもしれませんが、アプリがユーザーを変数として渡すことができる限り、OPENQUERY を利用したり、sys.database_principals をクエリしてアクセスを確認したりできます。

于 2013-10-03T00:53:40.867 に答える