通过SQL CLR验证NT用户

时间:2010-01-04 16:34:00

标签: c# .net sql clr impersonation

我需要能够针对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时是否有某种方法可以做到这一点?

提前致谢!

1 个答案:

答案 0 :(得分:0)

我建议构建一个封装代码的安全Web服务。然后从SQL CRL或您的Web应用程序中调用它。

HTH