在运行Mono的c#应用程序中更改当前Linux用户
本文关键字:Linux 用户 Mono 运行 应用程序 | 更新日期: 2023-09-27 18:10:19
我正在为Linux系统开发一个库(CLI汇编)。我想为图书馆的用户提供一种切换当前有效用户和组的方法。其主要原因是为了提供访问控制(某些操作仅由某些用户允许),其次是为了允许以特定用户的身份修改文件系统。
我已经确定了两种可能的方法:
1。
将Mono作为根启动并调用libc例程,如seteuid等通过设置/usr/bin/Mono的s位,然后从我的库(即在Mono运行时启动后)设置有效用户来实现这一点,导致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]
从逻辑上讲,我理解改变Mono的有效用户可能会有问题,因为它正在管理许多资源,这样做可能会导致问题。
2。在本地守护进程中处理身份验证,不更改Mono有效用户
我不确定是否有任何现成的解决方案,但从概念上讲,我正在考虑有一个守护进程作为根运行,库将与之通信(例如通过POSIX消息队列)以执行身份验证。守护进程以root身份运行,以便能够读取/etc/shadow。Mono的有效用户不会被更改,但我的库将跟踪进程作为哪个"等效用户"运行。不幸的是,这种方法不允许库以不同的用户访问文件系统。
我是否坚持第二种选择,或者是否有一些方法可以实际改变Mono进程的有效用户?
谢谢!
我的盒子下面的工作:)
EDIT #1:这应该以root身份执行。(片段取自: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);
}
}
}