通过 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登录失败

Windows身份验证和混合验证的差别

SQL 电子邮件验证(无正则表达式)

从 AD 获取当前登录的用户(而不是 NT AUTHORITY/NETWORK SERVICE)

(转)SQL Server 2005两种安全验证模式

如何验证SQL的select是不是有返回值?