SQL Server:检查角色成员身份

时间:2012-04-25 19:52:57

标签: sql-server sql-server-2008 active-directory

在SQL Server中,项目与活动目录组之间存在多对多的关系。我想构建一个查询,基于提供的活动目录用户,如果用户是该组的成员,我将能够查询与活动目录组关联的所有项目。

我走了使用IS_Member的道路,但这只适用于当前连接的用户。存储过程将由asp.net Web应用程序调用,该应用程序当前与特定的sql用户帐户连接。我不认为我可以使用Web应用程序中的集成身份验证和模拟进行连接,因为我不相信我们的基础结构配置将允许从用户计算机,通过Web服务器,然后到数据库服务器(3跳问题)进行委派

我可以在这做什么?

2 个答案:

答案 0 :(得分:1)

编写一个C#或VB.NET .exe,用于查询AD并在数据库中填充所有用户/组的表,并从您每天执行的SQL作业中调用它。然后只需使用同步表数据进行比较。通过这种方式,您可以避免尝试在运行中执行此操作的所有其他复杂性。群组成员资格通常不会改变。即使在AD中发生了某些变化,您也可以手动运行“同步作业”,事情就可以了。您可以使用Windows.Identity()或来自ASP.NET的任何内容来检查用户名。

答案 1 :(得分: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来检查它们的访问权限。