2012-04-25 125 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来检查其访问权限。

相关问题