Мне нужно проверить имя пользователя и пароль в 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 с ВНЕШНИМИ разрешениями?
Заранее спасибо!