Windows Workflow and Thread.CurrentPrincipal

I have a problem with Thread.CurrentPrincipal that does not propagate from the main thread to the workflow application.

Is there any way to do this?

Here is my sample application:

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(); } } 

and workflow

 <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> 

Exit the specified program:

MainThread Prinicipal type: System.Security.Principal.GenericPrincipal
MainThread Prinicipal Identity: Bob

WorkflowThread Prinicipal type: System.Security.Principal.GenericPrincipal
WorkflowThread Prinicipal Identity:

Any help would be greatly appreciated.

thanks

+4
source share
2 answers

WorkflowApplication uses a SynchronizationContext to schedule actual work. The default implementation uses ThreadPool as described by user7116 . However, you can implement your own SynchronizationContext and implement the Post() operation to do whatever you want.

+3
source

I believe that since Workflow works with ThreadPool , they do not inherit any of the principals that you defined in the main thread. You can try changing the principal of 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); 
+3
source

Source: https://habr.com/ru/post/1347279/


All Articles