Как запустить поток в другом контексте безопасности?

Как запустить поток в контексте безопасности другого пользователя? Когда процесс запускает поток, обычно также передается контекст безопасности, но как запустить поток в другом контексте безопасности с принципалом другого пользователя?

2 ответов


Я считаю, что вы можете просто установить CurrentPrincipal как первая операция кода потока после запуска потока, и только затем начните выполнять код, который должен выполняться с другим участником.

Это должно позаботиться о любых проверках на основе ролей .NET. Если вам также нужно олицетворение для вызовов ОС, вы можете олицетворять WindowsIdentity.

код (может или не может работать - не проверяли):

public void Run(object principalObj) {
    if (principalObj == null) {
        throw new ArgumentNullException("principalObj");
    }
    IPrincipal principal = (IPrincipal)principalObj;
    Thread.CurrentPrincipal = principal;
    WindowsIdentity identity = principal.Identity as WindowsIdentity;
    WindowsImpersonationContext impersonationContext = null;
    if (identity != null) {
        impersonationContext = identity.Impersonate();
    }
    try {
        // your code here
    } finally {
        if (impersonationContext != null) {
            impersonationContext.Undo();
        }
    }
}

...

Thread thread = new Thread(Run);
thread.Start(yourPrincipal);

Я использовал техники такой для олицетворения с успехом.

термин "олицетворение" в a контекст программирования относится к метод, который выполняет код под другом контексте пользователя, который изначально приложение, т. е. пользовательский контекст временно изменено один или несколько раз в течение выполнение заявки.

причина этого в том, чтобы выполнять задачи текущего пользователя контексте приложения не разрешено делать. Конечно, можно. предоставить пользователю, выполняющему применение больше привилегий, но обычно это плохая идея (из-за ограничения безопасности) или невозможно (например, если у вас нет полной административный доступ к машине так поступать.)