【发布时间】:2010-01-04 16:34:00
【问题描述】:
我需要能够针对 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 权限级别,并且显然调用 ASVAPI32.DLL 不能发生,除非解决方案设置为 UNSAFE 权限级别(?)。
所以(最后)我的问题 - 有没有办法在仍然以外部权限运行 CLR 的同时做到这一点?
提前致谢!
【问题讨论】:
标签: c# .net sql clr impersonation