Подтвердите пользователя NT через SQL CLR - PullRequest
2 голосов
/ 04 января 2010

Мне нужно проверить имя пользователя и пароль в Active Directory и узнать, существует ли этот пользователь.

Моя настройка состоит в том, что у меня есть два веб-сервера в DMZ, а затем SQL Server в локальной сети. У продавцов есть панель администратора на веб-серверах. Когда они входят в административную панель, я хочу, чтобы она запустила хранимую процедуру, которая проверит имя пользователя и пароль по Active Directory на локальной сети (поскольку веб-серверы не имеют доступа к Active Directory). Я пытался создать хранимый Proc 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 Ответ

0 голосов
/ 04 января 2010

Я бы предложил создать безопасный веб-сервис, который инкапсулирует ваш код. Затем вызовите его из SQL CRL или из своего веб-приложения.

НТН

...