Thread.CurrentPrincipal - непонятно
От: Jolly Roger  
Дата: 24.07.10 15:45
Оценка:
Псевдокод:

AppDomain.CurrentDomain.SetPrincipalPolicy(
    PrincipalPolicy.WindowsPrincipal);
...
// Приложение запущено от имени User0
WindowsIdentity wi1; // User1
WindowsIdentity wi2; // User2

using (var i1 = wi1.Impersonate())
{
    textBox.AppendText(Environment.UserName + "\r\n"); //         <- User1
    textBox.AppendText(Thread.CurrentPrincipal.Identity.Name + "\r\n"); // <- User1
}
textBox.AppendText(Environment.UserName + "\r\n"); //          <- User0
textBox.AppendText(Thread.CurrentPrincipal.Identity.Name + "\r\n"); // <- User1 !!!!

using (var i2 = wi2.Impersonate())
{
    textBox.AppendText(Environment.UserName + "\r\n"); //         <- User2
    textBox.AppendText(Thread.CurrentPrincipal.Identity.Name + "\r\n"); // <- User1 !!!!
}
textBox.AppendText(Environment.UserName + "\r\n"); //          <- User0
textBox.AppendText(Thread.CurrentPrincipal.Identity.Name + "\r\n"); // <- User1 !!!!


Получается, будучи единожды назначенным, Thread.CurrentPrincipal далее уже не зависит от имперсонированного пользователя?! Если к нему обратиться до первой имперсонации, то там окажется User0 и более уже не изменится. Попытки выполнить в любом месте Thread.CurrentPrincipal = null ничего, разумеется, не изменили — значение остаётся тем-же.

Это баг или так задумано? И если последнее, то в чём идея?

PS NET 3.5, завтра проверю на 4-м
"Нормальные герои всегда идут в обход!"
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.