Je dois pouvoir valider un nom d'utilisateur et un mot de passe donnés par rapport à Active Directory et retourner si cet utilisateur existe. Ma configuration est que j'ai deux serveurs Web dans une zone démilitarisée, puis un serveur SQL dans le réseau local. Les commerciaux ont un panneau d'administration sur les serveurs Web. Quand ils se connectent au panneau d'administration, je veux qu'il exécute une procédure stockée qui validera le nom d'utilisateur et le mot de passe contre Active Directory du côté LAN (puisque les serveurs Web n'ont pas accès à Active Directory). J'ai essayé de faire un SQL stocké Proc qui effectue les opérations suivantes:Valider l'utilisateur NT via SQL CLR
#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;
}
Cependant quand je vais le mettre sur le serveur SQL, je reçois l'erreur
CREATE ASSEMBLY failed because type "UserDefinedFunctions" in external_access assembly "SQLCLR" has a pinvokeimpl method. P/Invoke is not allowed in external_access assemblies.
Ce qui se produit parce que la solution est réglée sur Le niveau d'autorisation EXTERNAL et l'appel ASVAPI32.DLL appelant apparemment ne peut pas se produire à moins que la solution est définie au niveau d'autorisation UNSAFE (?). Donc (enfin) ma question - existe-t-il un moyen de le faire tout en continuant à utiliser le CLR avec des permissions EXTERNES?
Merci d'avance!