我需要能够针对Active Directory验证给定的用户名和密码,并返回该用户是否存在。
我的设置是我在DMZ中有两个Web服务器,然后是LAN中的SQL Server。销售人员在Web服务器上有一个管理面板。当他们登录管理面板时,我希望它运行一个存储过程,该存储过程将针对LAN端的Active Directory验证用户名和密码(因为Web服务器无权访问Active Directory)。我尝试制作一个执行以下操作的SQL存储过程:
#region setup impersonation via interop
public const int LOGON32_LOGON_INTERACTIVE = 2;
public const int LOGON32_PROVIDER_DEFAULT = 0;
[DllImport("ADVAPI32.dll", SetLastError = true, CharSet = CharSet.Auto)]
public static extern bool LogonUser
(
string lpszUsername,
string lpszDomain,
string lpszPassword,
int dwLogonType,
int dwLogonProvider,
ref IntPtr phToken
);
#endregion
[Microsoft.SqlServer.Server.SqlFunction]
public static SqlBoolean NTAuthenticateUser(SqlString UserName, SqlString Password)
{
IntPtr token = IntPtr.Zero;
return LogonUser
(
UserName.Value,
"MYDOMAIN",
Password.Value,
LOGON32_LOGON_INTERACTIVE,
LOGON32_PROVIDER_DEFAULT,
ref token
);
return true;
}
然而,当我把它放在SQL Server上时,我收到了错误
CREATE ASSEMBLY failed because type "UserDefinedFunctions" in external_access assembly "SQLCLR" has a pinvokeimpl method. P/Invoke is not allowed in external_access assemblies.
发生这种情况是因为解决方案设置为EXTERNAL权限级别,除非解决方案设置为UNSAFE权限级别(?),否则显然无法调用ASVAPI32.DLL。
所以(最后)我的问题 - 在使用EXTERNAL权限运行CLR时是否有某种方法可以做到这一点?
提前致谢!
答案 0 :(得分:0)
我建议构建一个封装代码的安全Web服务。然后从SQL CRL或您的Web应用程序中调用它。
HTH