2012-04-25 172 views
0

在SQL Server中,我在項目和活動目錄組之間有多對多的關係。我想建立一個基於提供的活動目錄用戶的查詢,如果用戶是該組的成員,我將能夠查詢與活動目錄組關聯的所有項目。SQL Server:檢查角色成員身份

我走了使用IS_Member的道路,但只適用於當前連接的用戶。存儲過程將由一個asp.net Web應用程序調用,該應用程序當前連接了特定的SQL用戶帳戶。我不認爲我可以在Web應用程序中使用集成身份驗證和模擬進行連接,因爲我不相信我們的基礎架構配置將允許從用戶計算機,通過Web服務器,然後到數據庫服務器的委派(3跳問題) 。

我能在這裏做什麼?

+0

你可以嘗試的一件事是編寫一個CLR存儲過程。然後,您可以使用WindowsIdentity來執行S4U檢查組成員資格或任何用戶。 – 2012-04-26 01:29:58

回答

1

編寫一個查詢AD的C#或VB.NET .exe,並使用所有用戶/組在數據庫中填充一個表,並從每日執行的SQL作業調用它。然後,只需使用同步的表格數據進行比較即可。通過這種方式,您可以避免嘗試在運行中執行它的所有其他複雜性。組成員身份不會經常更改。即使AD發生了一些變化,你也可以手動運行你的「同步工作」,事情就會好起來。您可以使用Windows.Identity()或ASP.NET中的任何內容來檢查用戶名。

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管理員協商,以確保你得到該集團的正確domainComponents和organizationalUnits來調整OPENQUERY。其中一個缺點是,查詢你的AD組可能需要一段時間,顯然取決於成員資格的大小。這可能很痛苦,但只要您的應用程序可以將用戶作爲變量傳遞,您就可以利用OPENQUERY甚至查詢sys.database_principals來檢查其訪問權限。

相關問題