Ussuration d'identité Windows en C# : un guide détaillé
L'usurpation d'identité permet à un processus d'assumer temporairement l'identité d'un autre utilisateur. Cette technique est souvent utilisée lorsqu'un processus nécessite des privilèges élevés ou doit accéder à des ressources restreintes à des utilisateurs spécifiques.
Usurpation d'identité d'un système local à un autre utilisateur
Dans votre scénario spécifique, vous disposez d'un service Windows exécuté en tant que LocalSystem qui doit usurper l'identité de l'utilisateur XYZ pour se connecter à une base de données à l'aide de la sécurité intégrée. Ceci peut être réalisé sans connaître le mot de passe de XYZ.
Usuration d'identité sans mot de passe
Pour usurper l'identité sans mot de passe, vous pouvez exploiter l'interface du fournisseur de support de sécurité (SSPI) en C#. Cette méthode utilise l'authentification Kerberos et nécessite un minimum de code :
using System.Runtime.InteropServices; ... [DllImport("secur32.dll", CharSet = CharSet.Unicode, SetLastError = true)] private static extern bool LogonUserW(string user, string domain, string password, int logonType, int logonProvider, out SafeTokenHandle token); public static TokenHandle ImpersonateUser(string user, string domain = null) { // Default parameters for 'domain' and 'logonProvider' if (domain == null) domain = "."; // Default domain int logonProvider = 0; // Logon provider not used SafeTokenHandle token = null; bool success = LogonUserW(user, domain, null /* password */, LOGON32_LOGON_INTERACTIVE, logonProvider, out token); if (!success) { int err = Marshal.GetLastWin32Error(); throw new Win32Exception(err); } return token; } public class TokenHandle : SafeHandle { public TokenHandle(IntPtr handle) : base(handle, true) { } public override bool IsInvalid => handle == IntPtr.Zero; protected override bool ReleaseHandle() => CloseHandle(handle); [DllImport("kernel32.dll", SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] private static extern bool CloseHandle(IntPtr hObject); }
Pour usurper l'identité, créez un objet TokenHandle avec le nom de l'utilisateur souhaité et éventuellement le domaine. Ensuite, appelez la méthode ImpersonateUser sur le thread sous lequel vous souhaitez vous faire passer pour. Jetez le TokenHandle une fois terminé.
Usuration d'identité avec mot de passe
Si un mot de passe est requis, vous pouvez utiliser la fonction LoadUserProfile et transmettre le mot de passe à la fonction ImpersonateLoggedOnUser. Cependant, le stockage et la gestion sécurisée des mots de passe dépassent le cadre de cette réponse. Il est recommandé de consulter des pratiques de gestion sécurisée des mots de passe ou d'envisager des méthodes d'authentification alternatives.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!