通过 SQL CLR 验证 NT 用户
Posted
技术标签:
【中文标题】通过 SQL CLR 验证 NT 用户【英文标题】:Validate NT User via SQL CLR 【发布时间】: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 的同时做到这一点?
提前致谢!
【问题讨论】:
【参考方案1】:我建议构建一个安全的 Web 服务来封装您的代码。然后从 SQL CRL 或您的 Web 应用程序调用它。
HTH
【讨论】:
以上是关于通过 SQL CLR 验证 NT 用户的主要内容,如果未能解决你的问题,请参考以下文章
SQL Server中的用户'NT AUTHORITY ANONYMOUS LOGON登录失败