2013-04-22 29 views
7

Tôi đang phát triển một thư viện (lắp ráp CLI) cho một hệ thống Linux. Tôi muốn cung cấp một phương pháp cho người dùng của thư viện để chuyển đổi người dùng và nhóm có hiệu lực hiện tại. Lý do chính là cung cấp điều khiển truy cập (một số hành động nhất định chỉ được một số người dùng cho phép) và thứ hai để cho phép sửa đổi hệ thống tệp như một người dùng nhất định.Thay đổi người dùng Linux hiện tại trong ứng dụng C# đang chạy bằng Mono?

tôi đã xác định được hai cách tiếp cận có thể:

1. Bắt đầu Mono như là người chủ và P/gọi thói quen libc như seteuid, vv

Sau khi thực hiện điều này bằng cách thiết lập các bit s của/usr/bin/mono và sau đó thiết lập lại sử dụng có hiệu lực từ thư viện của tôi (tức là sau khi mono chạy-thời gian được bắt đầu) gây ra một vụ tai nạn ở mono khi nó chấm dứt:

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] 

logic tôi hiểu có thể có vấn đề wi th thay đổi người dùng hiệu quả của Mono vì nó đang quản lý một số tài nguyên và có thể gây ra sự cố khi làm như vậy.

2. authentication Xử lý trong một daemon bản địa và không thay đổi Mono sử dụng hiệu quả

Tôi không chắc chắn nếu có bất kỳ giải pháp off-the-shelf cho điều này, nhưng khái niệm Tôi đang nghĩ có một daemon chạy dưới dạng root, thư viện sẽ liên lạc với (ví dụ thông qua hàng đợi thông điệp POSIX) để thực hiện xác thực. Daemon đang chạy dưới dạng root để có thể đọc/etc/shadow. Người dùng hiệu quả của Mono sẽ không được thay đổi, nhưng thư viện của tôi sẽ theo dõi "người dùng tương đương" nào mà quy trình đang chạy. Rất tiếc, phương pháp này sẽ không cho phép thư viện truy cập vào hệ thống tệp dưới dạng người dùng khác.

Câu hỏi

Am Tôi bị mắc kẹt với tùy chọn thứ hai, hoặc là có một số cách để thực sự thay đổi người sử dụng có hiệu quả của một quá trình Mono?

Cảm ơn bạn!

Trả lời

5

Các công trình sau đây trên hộp của tôi :)

EDIT # 1: này nên được thực hiện như là người chủ. (Đoạn trích được lấy từ: 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

Tôi không biết Mono đã triển khai WindowsIdentity như một thứ gì đó có thể sử dụng - cảm ơn vì đã chỉ ra! Với mã mẫu tôi vẫn chạy vào lỗi phân đoạn tôi đã có khi sử dụng seteuid(). Chấp nhận câu trả lời này trong mọi trường hợp. – d99kris

+0

Bạn đang sử dụng phiên bản mono nào? Tôi đang chạy mono 3.0.7-1 trên hệ thống x64 và nhắm mục tiêu khuôn khổ 4.0. – dna

Các vấn đề liên quan