diff --git a/src/libraries/System.Private.CoreLib/src/System/Threading/Thread.cs b/src/libraries/System.Private.CoreLib/src/System/Threading/Thread.cs index ca1d94f6fdf291..95f7bb702c0f5d 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Threading/Thread.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Threading/Thread.cs @@ -133,11 +133,12 @@ public static IPrincipal? CurrentPrincipal { get { - if (s_asyncLocalPrincipal is null) + IPrincipal? principal = s_asyncLocalPrincipal?.Value; + if (principal is null) { - CurrentPrincipal = AppDomain.CurrentDomain.GetThreadPrincipal(); + CurrentPrincipal = (principal = AppDomain.CurrentDomain.GetThreadPrincipal()); } - return s_asyncLocalPrincipal?.Value; + return principal; } set { diff --git a/src/libraries/System.Threading.Thread/tests/ThreadTests.cs b/src/libraries/System.Threading.Thread/tests/ThreadTests.cs index 156487c6e16048..017341ba856f26 100644 --- a/src/libraries/System.Threading.Thread/tests/ThreadTests.cs +++ b/src/libraries/System.Threading.Thread/tests/ThreadTests.cs @@ -327,7 +327,8 @@ public static void CurrentCultureTest_DifferentThread() CultureInfo uiCulture = (CultureInfo)CultureInfo.CurrentCulture.Clone(); ExceptionDispatchInfo exceptionFromThread = null; - var t = new Thread(() => { + var t = new Thread(() => + { try { Assert.Same(culture, Thread.CurrentThread.CurrentCulture); @@ -432,11 +433,12 @@ public static void CurrentPrincipalContextFlowTest() { Thread.CurrentPrincipal = new ClaimsPrincipal(); - await Task.Run(async() => { + await Task.Run(async () => + { Assert.IsType(Thread.CurrentPrincipal); - await Task.Run(async() => + await Task.Run(async () => { Assert.IsType(Thread.CurrentPrincipal); @@ -465,7 +467,7 @@ public static void CurrentPrincipalContextFlowTest_NotFlow() Thread.CurrentPrincipal = new ClaimsPrincipal(); Task task; - using(ExecutionContext.SuppressFlow()) + using (ExecutionContext.SuppressFlow()) { Assert.True(ExecutionContext.IsFlowSuppressed()); @@ -1111,6 +1113,85 @@ public static void WindowsPrincipalPolicyTest_Windows() }).Dispose(); } + + [Fact] + [PlatformSpecific(TestPlatforms.Windows)] + public static void WindowsPrincipalPolicyTest_Windows_NewThreads() + { + RemoteExecutor.Invoke(() => + { + AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal); + + IPrincipal currentPrincipal = Thread.CurrentPrincipal; + + Assert.NotNull(currentPrincipal); + Assert.True(currentPrincipal.Identity.IsAuthenticated); + + var first = new Thread(CheckPrincipal); + first.Start(currentPrincipal); + first.Join(); + + var second = new Thread(CheckPrincipal); + second.Start(currentPrincipal); + second.Join(); + }).Dispose(); + + static void CheckPrincipal(object principal) + { + Assert.True(Thread.CurrentPrincipal.Identity.IsAuthenticated); + Assert.NotNull(Thread.CurrentPrincipal); + Assert.Equal((IPrincipal)principal, Thread.CurrentPrincipal); + } + } + + [Fact] + public static void NoPrincipalPolicyTest_NewThreads() + { + RemoteExecutor.Invoke(() => + { + AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.NoPrincipal); + + Assert.Null(Thread.CurrentPrincipal); + + var first = new Thread(() => Assert.Null(Thread.CurrentPrincipal)); + first.Start(); + first.Join(); + + var second = new Thread(() => Assert.Null(Thread.CurrentPrincipal)); + second.Start(); + second.Join(); + }).Dispose(); + } + + [Fact] + [PlatformSpecific(TestPlatforms.Windows)] + public static void NoPrincipalToWindowsPrincipalPolicyTest_Windows_NewThreads() + { + RemoteExecutor.Invoke(() => + { + AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.NoPrincipal); + + Assert.Null(Thread.CurrentPrincipal); + + var first = new Thread(() => Assert.Null(Thread.CurrentPrincipal)); + first.Start(); + first.Join(); + + AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal); + + var second = new Thread(CheckPrincipal); + second.Start(Thread.CurrentPrincipal); + second.Join(); + }).Dispose(); + + static void CheckPrincipal(object principal) + { + Assert.True(Thread.CurrentPrincipal.Identity.IsAuthenticated); + Assert.NotNull(Thread.CurrentPrincipal); + Assert.Equal((IPrincipal)principal, Thread.CurrentPrincipal); + } + } + [Fact] [PlatformSpecific(TestPlatforms.AnyUnix)] public static void WindowsPrincipalPolicyTest_Unix()