首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >设置线程的标识

设置线程的标识
EN

Stack Overflow用户
提问于 2008-11-03 14:49:11
回答 3查看 36.3K关注 0票数 27

在C#中,如何设置线程的标识?

例如,如果我有已经启动的线程MyThread,我可以更改MyThread的身份吗?

或者这是不可能的?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2008-11-03 16:28:13

您可以通过创建一个新的主体来设置线程的标识。您可以使用从System.Security.Principal.IIdentity继承的任何标识,但您需要一个从System.Security.Principal.IPrincipal继承的类,该类采用您正在使用的标识类型。

为了简单起见,.Net框架提供了GenericPrincipalGenericIdentity类,它们可以像这样使用:

代码语言:javascript
复制
 using System.Security.Principal;

 // ...
 GenericIdentity identity = new GenericIdentity("M.Brown");
 identity.IsAuthenticated = true;

 // ...
 System.Threading.Thread.CurrentPrincipal =
    new GenericPrincipal(
        identity,
        new string[] { "Role1", "Role2" }
    );

 //...
 if (!System.Threading.Thread.CurrentPrincipal.IsInRole("Role1"))
 {
      Console.WriteLine("Permission denied");
      return;
 }

然而,这并不会给你windows权限去使用新的身份。但是,如果你正在开发一个网站,并且想要创建自己的用户管理,它可能会很有用。

如果你想伪装成不同的Windows用户,而不是你当前使用的帐户,那么你需要使用模拟。有关如何执行此操作的示例,可在System.Security.Principal.WindowsIdentity.Impersonate()的帮助中找到。关于您正在运行的帐户可以模拟的帐户有一些限制。

在某些情况下,.Net框架会为您执行模拟。发生这种情况的一个示例是,如果您正在开发ASP.Net网站,并且为正在运行的虚拟目录或站点打开了集成Windows身份验证。

票数 33
EN

Stack Overflow用户

发布于 2015-08-22 22:00:42

接受答案的更新仅适用于.NET Framework4.5及更高版本的

.NET 4.5中,属性IsAuthenticated没有设置访问器,因此您不能像接受答案那样直接设置它。

您可以使用以下代码来设置该属性。

代码语言:javascript
复制
GenericIdentity identity = new GenericIdentity("someuser", "Forms");
Thread.CurrentPrincipal = new GenericPrincipal(identity, new string[] { "somerole" });
票数 4
EN

Stack Overflow用户

发布于 2008-11-03 14:53:48

是的,按字面意思使用impersonation

代码语言:javascript
复制
using (new Impersonation())
{
    // your elevated code
}

这个类如下所示,对于设置,如果它看起来很奇怪,我会使用castle字典适配器。

代码语言:javascript
复制
[PermissionSet(SecurityAction.Demand, Name = "FullTrust")]
public class Impersonation : IDisposable
{
    private readonly SafeTokenHandle _handle;
    private readonly WindowsImpersonationContext _context;

    //const int Logon32LogonNewCredentials = 9; 
    private const int Logon32LogonInteractive = 2;

    public Impersonation()
    {
        var settings = Settings.Instance.Whatever;
        var domain = settings.Domain;
        var username = settings.User;
        var password = settings.Password;
        var ok = LogonUser(username, domain, password, Logon32LogonInteractive, 0, out _handle);
        if (!ok)
        {
            var errorCode = Marshal.GetLastWin32Error();
            throw new ApplicationException(string.Format("Could not impersonate the elevated user.  LogonUser returned error code {0}.", errorCode));
        }
        _context = WindowsIdentity.Impersonate(_handle.DangerousGetHandle());
    }

    public void Dispose()
    {
        _context.Dispose();
        _handle.Dispose();
    }

    [DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
    private static extern bool LogonUser(String lpszUsername, String lpszDomain, String lpszPassword, int dwLogonType, int dwLogonProvider, out SafeTokenHandle phToken);

    public sealed class SafeTokenHandle : SafeHandleZeroOrMinusOneIsInvalid
    {
        private SafeTokenHandle()
            : base(true)
        { }

        [DllImport("kernel32.dll")]
        [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
        [SuppressUnmanagedCodeSecurity]
        [return: MarshalAs(UnmanagedType.Bool)]
        private static extern bool CloseHandle(IntPtr handle);

        protected override bool ReleaseHandle()
        {
            return CloseHandle(handle);
        }
    }
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/258857

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档