您描述的问题是一个经典的双跳方案,可以(最终)通过称为 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 来检查他们的访问权限。