【问题标题】:Validate NT User via SQL CLR通过 SQL CLR 验证 NT 用户
【发布时间】: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


    【解决方案1】:

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

    HTH

    【讨论】:

      猜你喜欢
      • 2019-10-11
      • 1970-01-01
      • 1970-01-01
      • 2022-11-16
      • 1970-01-01
      • 1970-01-01
      • 2016-10-30
      • 1970-01-01
      • 2011-12-12
      相关资源
      最近更新 更多