0

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

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

我可以在这里做什么?

4

2 回答 2

1

编写一个 C# 或 VB.NET .exe 来查询 AD 并在数据库中填充所有用户/组的表,并从您每天执行的 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。这样做的一个缺点是查询您的 AD 组可能需要一段时间,这显然取决于成员的规模。这可能很痛苦,但只要您的应用程序可以将用户作为变量传递,您就可以利用 OPENQUERY 甚至查询 sys.database_principals 来检查他们的访问权限。

于 2013-10-03T00:53:40.867 回答