Рабочий процесс Windows и Thread.CurrentPrincipal

У меня проблема с тем, что Thread.CurrentPrincipal не распространяется из основного потока в приложение рабочего процесса.

Есть какой-либо способ сделать это?

Вот мой пример приложения:

class Program
{
    static void Main(string[] args)
    {
        Thread.CurrentPrincipal = new GenericPrincipal(new GenericIdentity("Bob", "Passport"), new string[] { "managers", "executives" });

        System.Console.WriteLine("MainThread Prinicipal type: " + Thread.CurrentPrincipal.GetType().ToString());
        System.Console.WriteLine("MainThread Prinicipal Identity: " + Thread.CurrentPrincipal.Identity.Name);
        System.Console.WriteLine();

        AutoResetEvent syncEvent = new AutoResetEvent(false);

        WorkflowApplication application = new WorkflowApplication(new Workflow1());

        application.Completed = delegate(WorkflowApplicationCompletedEventArgs e)
        {
            syncEvent.Set();
        };

        application.Run();
        syncEvent.WaitOne();
    }
}

и рабочий процесс

<Activity mc:Ignorable="sap" x:Class="WorkflowConsoleApplication1.Workflow1" sap:VirtualizedContainerService.HintSize="273,427" mva:VisualBasic.Settings="Assembly references and imported namespaces for internal implementation" xmlns="http://schemas.microsoft.com/netfx/2009/xaml/activities" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mv="clr-namespace:Microsoft.VisualBasic;assembly=System" xmlns:mva="clr-namespace:Microsoft.VisualBasic.Activities;assembly=System.Activities" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:s1="clr-namespace:System;assembly=System" xmlns:s2="clr-namespace:System;assembly=System.Xml" xmlns:s3="clr-namespace:System;assembly=System.Core" xmlns:s4="clr-namespace:System;assembly=System.ServiceModel" xmlns:sad="clr-namespace:System.Activities.Debugger;assembly=System.Activities" xmlns:sap="http://schemas.microsoft.com/netfx/2009/xaml/activities/presentation" xmlns:scg="clr-namespace:System.Collections.Generic;assembly=System" xmlns:scg1="clr-namespace:System.Collections.Generic;assembly=System.ServiceModel" xmlns:scg2="clr-namespace:System.Collections.Generic;assembly=System.Core" xmlns:scg3="clr-namespace:System.Collections.Generic;assembly=mscorlib" xmlns:sd="clr-namespace:System.Data;assembly=System.Data" xmlns:sl="clr-namespace:System.Linq;assembly=System.Core" xmlns:st="clr-namespace:System.Threading;assembly=System.Core" xmlns:st1="clr-namespace:System.Threading;assembly=System" xmlns:st2="clr-namespace:System.Text;assembly=mscorlib" xmlns:st3="clr-namespace:System.Threading;assembly=mscorlib" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Sequence sad:XamlDebuggerXmlReader.FileName="C:\projects\WorkflowConsoleApplication1\WorkflowConsoleApplication1\Workflow1.xaml" sap:VirtualizedContainerService.HintSize="233,387">
        <WriteLine sap:VirtualizedContainerService.HintSize="211,61" Text="[&quot;WorkflowThread Prinicipal type: &quot; + System.Threading.Thread.CurrentPrincipal.GetType().ToString()]" />
        <WriteLine sap:VirtualizedContainerService.HintSize="211,61" Text="[&quot;WorkflowThread Prinicipal Identity: &quot; + System.Threading.Thread.CurrentPrincipal.Identity.Name]" />
        <WriteLine sap:VirtualizedContainerService.HintSize="211,61" />
    </Sequence>
</Activity>

Вывод из приведенной выше программы:

Тип участника MainThread: System.Security.Principal.GenericPrincipal
Идентификатор участника MainThread: Боб

Тип участника WorkflowThread: System.Security.Principal.GenericPrincipal
Идентификатор участника WorkflowThread:

Любая помощь будет оценена.

Спасибо


person Zak    schedule 08.04.2011    source источник


Ответы (2)


WorkflowApplication использует свой SynchronizationContext для планирования фактической работы. Реализация по умолчанию использует ThreadPool как описано пользователем7116. Однако вы можете реализовать свою собственную SynchronizationContext и реализовать операцию Post(), чтобы делать все, что хотите.

person Maurice    schedule 08.04.2011
comment
Черт, ты тоже смотришь rss-ленту [workflow-foundation-4]? - person ; 08.04.2011
comment
Ага :-) Теперь почему комментарий должен иметь минимальную длину? - person Maurice; 08.04.2011
comment
это раздражает, но если вы получите этот пользовательский скрипт, будет проще иметь комментарии минимальной длины ( вставляет @username: в начале комментария) (редактировать: фиксированная ссылка @maurice) - person ; 08.04.2011

Я полагаю, что, поскольку Workflows работают с ThreadPool, они не будут наследовать какой-либо принципал, который вы установили в основном потоке. Вы можете попробовать изменить участника AppDomain:

// per MSDN: Create a principal to use for new threads.
IPrincipal principal = new GenericPrincipal(
    new GenericIdentity("Bob", "Passport"),
    new string[] { "managers", "executives" });
AppDomain.CurrentDomain.SetThreadPrincipal(principal);
person user7116    schedule 08.04.2011