Проверка пользователя NT через SQL CLR

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

Моя настройка заключается в том, что у меня есть два веб-сервера в DMZ, а затем SQL Server в локальной сети. У продавцов есть панель администратора, которая находится на веб-серверах. Когда они входят в панель администратора, я хочу, чтобы она запускала хранимую процедуру, которая будет проверять имя пользователя и пароль в Active Directory на стороне локальной сети (поскольку веб-серверы не имеют доступа к Active Directory). Я попытался создать SQL Stored Proc, который делает следующее:

#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 с ВНЕШНИМИ разрешениями?

Заранее спасибо!


person ElementZero    schedule 04.01.2010    source источник


Ответы (1)


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

ХТН

person unclepaul84    schedule 04.01.2010