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