2013-04-22 2 views
7

Я разрабатываю библиотеку (сборку CLI) для системы Linux. Я хочу предоставить метод для пользователей библиотеки для переключения текущего эффективного пользователя и группы. Основная причина заключается в том, чтобы обеспечить контроль доступа (определенные действия разрешены только определенными пользователями), а во-вторых, разрешить изменение файловой системы как определенного пользователя.Изменить текущего пользователя Linux в приложении C#, работающем с Mono?

я определил два возможных подхода:

1. Запустите Моно как корень и P/Invoke LibC процедуры, как seteuid и т.д.

Осуществив это, установив ей немного/USR/бен/моно, а затем задерживая эффективный пользователь из моей библиотеки (т.е. после запуска Mono времени выполнения) вызывает сбой в моно, когда она заканчивается:

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] 

Логически я понимаю, что может быть проблемы Wi что меняет эффективный пользователь Mono, поскольку он управляет несколькими ресурсами, и это может вызвать проблемы.

2. Аутентификация Handle в нативной демона и не изменять Mono эффективного пользователя

я не уверен, если есть какие-либо внедорожных готовые решения для этого, но концептуально я имею в виду, чтобы иметь демон с правами администратора, с которым библиотека будет взаимодействовать (например, через очереди сообщений POSIX) для выполнения аутентификации. Демон работает от имени root, чтобы читать/etc/shadow. Эффективный пользователь Mono не будет изменен, но моя библиотека будет отслеживать, какой «эквивалентный пользователь» выполняет этот процесс. К сожалению, этот подход не позволит библиотеке обращаться к файловой системе как к другому пользователю.

Вопрос

Am Я застрял на второй вариант, или есть какой-то способ, чтобы реально изменить эффективного пользователя процесса Mono?

Спасибо!

ответ

5

следующие работы на моей коробке :)

EDIT # 1: Это должно быть выполнено как корень. (Отрывок взят из: 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); 
    } 
} 
} 
+0

я не знаю Mono реализована WindowsIdentity, как-то полезное - спасибо за указание! С образцом кода я все еще сталкиваюсь с ошибкой сегментации, которую я использовал при использовании seteuid(). Принимая этот ответ в любом случае. – d99kris

+0

Какую версию моно вы используете? Я запускаю mono 3.0.7-1 в системе x64 и настраиваю рамки 4.0. – dna

Смежные вопросы