Cambia utente Linux corrente in un’applicazione C # in esecuzione con Mono?

Sto sviluppando una libreria (assembly CLI) per un sistema Linux. Voglio fornire un metodo per gli utenti della libreria per cambiare l’attuale utente e gruppo corrente. Il motivo principale è fornire il controllo degli accessi (alcune azioni consentite solo da determinati utenti) e, in secondo luogo, abilitare la modifica del file system come un determinato utente.

Ho identificato due possibili approcci:

1. Avvia Mono come root e P / invoca le routine libc come seteuid, ecc

Avendo implementato questo impostando il bit s di / usr / bin / mono e quindi reimpostando l’utente effettivo dalla mia libreria (cioè dopo l’avvio del tempo di esecuzione di Mono) provoca un arresto anomalo in Mono quando termina:

ERROR:handles.c:1940:_wapi_handle_update_refs: assertion failed: (thr_ret == 0) Native stacktrace: mono2 [0x8bb6c] /lib/libc.so.6(__default_rt_sa_restorer_v2+0) [0x4020a5a0] /lib/libc.so.6(gsignal+0x40) [0x4020920c] 

Logicamente capisco che potrebbero esserci problemi nel cambiare l’utente effettivo di Mono in quanto gestisce un numero di risorse, e potrebbe causare dei problemi.

2. Gestire l’autenticazione in un demone nativo e non modificare l’utente mono effettivo

Non sono sicuro che ci siano soluzioni off-the-shelf per questo, ma concettualmente sto pensando di avere un demone in esecuzione come root, con cui la libreria comunicherà (ad esempio tramite le code di messaggi POSIX) per eseguire l’autenticazione . Il demone è in esecuzione come root per poter leggere / etc / shadow. L’utente effettivo di Mono non verrà modificato, ma la mia libreria terrà traccia di quale “utente equivalente” sta eseguendo il processo come. Sfortunatamente questo approccio non consentirà alla libreria di accedere al file system come un utente diverso.

Domanda

Sono bloccato con la seconda opzione, o c’è un modo per cambiare effettivamente utente effettivo di un processo Mono?

Grazie!

I seguenti lavori sulla mia scatola 🙂

EDIT # 1: Questo dovrebbe essere eseguito come root. (Snippet tratto da: http://msdn.microsoft.com/en-us/library/w070t6ka.aspx )

 using System; using System.Security.Permissions; using System.Security.Principal; public class ImpersonationDemo { // Test harness. // If you incorporate this code into a DLL, be sure to demand FullTrust. [PermissionSetAttribute(SecurityAction.Demand, Name = "FullTrust")] public static void Main (string[] args) { try { // Check the identity. Console.WriteLine ("Before impersonation: " + WindowsIdentity.GetCurrent ().Name); // Impersonate a user using (WindowsIdentity newId = new WindowsIdentity("Your user name")) using (WindowsImpersonationContext impersonatedUser = newId.Impersonate()) { // Check the identity. Console.WriteLine ("After impersonation: " + WindowsIdentity.GetCurrent ().Name); } // Releasing the context object stops the impersonation // Check the identity. Console.WriteLine ("After closing the context: " + WindowsIdentity.GetCurrent ().Name); } catch (Exception ex) { Console.WriteLine ("Exception occurred. " + ex.Message); } } }