From: Tanner Gooding Date: Thu, 13 Aug 2020 13:35:32 +0000 (-0700) Subject: Updating ClaimsPrincipal.Current to default back to Thread.CurrentPrincipal, as was... X-Git-Tag: submit/tizen/20210909.063632~6026 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=6e89ae86dedf18a7d61c0db271c9de3e9005bfa1;p=platform%2Fupstream%2Fdotnet%2Fruntime.git Updating ClaimsPrincipal.Current to default back to Thread.CurrentPrincipal, as was done on .NET Framework (#40623) * Updating ClaimsPrincipal.Current to default back to Thread.CurrentPrincipal, as was done on .NET Framework * Add test that ClaimsPrincipal.Current falls back to Thread.CurrentPrincipal to match .NET Framework. Co-authored-by: Eric Erhardt --- diff --git a/src/libraries/System.Security.Claims/src/System.Security.Claims.csproj b/src/libraries/System.Security.Claims/src/System.Security.Claims.csproj index ca146c4..ca4bd80 100644 --- a/src/libraries/System.Security.Claims/src/System.Security.Claims.csproj +++ b/src/libraries/System.Security.Claims/src/System.Security.Claims.csproj @@ -17,5 +17,6 @@ + diff --git a/src/libraries/System.Security.Claims/src/System/Security/Claims/ClaimsPrincipal.cs b/src/libraries/System.Security.Claims/src/System/Security/Claims/ClaimsPrincipal.cs index f7e4aa8..6762cdd 100644 --- a/src/libraries/System.Security.Claims/src/System/Security/Claims/ClaimsPrincipal.cs +++ b/src/libraries/System.Security.Claims/src/System/Security/Claims/ClaimsPrincipal.cs @@ -5,6 +5,7 @@ using System.Collections.Generic; using System.IO; using System.Runtime.Serialization; using System.Security.Principal; +using System.Threading; namespace System.Security.Claims { @@ -26,6 +27,11 @@ namespace System.Security.Claims private static Func, ClaimsIdentity?> s_identitySelector = SelectPrimaryIdentity; private static Func s_principalSelector = ClaimsPrincipalSelector; + private static ClaimsPrincipal SelectClaimsPrincipal() + { + return (Thread.CurrentPrincipal is ClaimsPrincipal claimsPrincipal) ? claimsPrincipal : new ClaimsPrincipal(Thread.CurrentPrincipal!); + } + protected ClaimsPrincipal(SerializationInfo info, StreamingContext context) { throw new PlatformNotSupportedException(); @@ -280,12 +286,7 @@ namespace System.Security.Claims // just accesses the current selected principal selector, doesn't set get { - if (s_principalSelector != null) - { - return s_principalSelector(); - } - - return null; + return s_principalSelector is not null ? s_principalSelector() : SelectClaimsPrincipal(); } } diff --git a/src/libraries/System.Security.Claims/tests/ClaimsPrincipalTests.cs b/src/libraries/System.Security.Claims/tests/ClaimsPrincipalTests.cs index 81f3420..c28b770 100644 --- a/src/libraries/System.Security.Claims/tests/ClaimsPrincipalTests.cs +++ b/src/libraries/System.Security.Claims/tests/ClaimsPrincipalTests.cs @@ -5,6 +5,8 @@ using System.Collections.Generic; using System.IO; using System.Linq; using System.Security.Principal; +using System.Threading; +using Microsoft.DotNet.RemoteExecutor; using Xunit; namespace System.Security.Claims @@ -200,6 +202,35 @@ namespace System.Security.Claims AssertExtensions.Throws("reader", () => new ClaimsPrincipal((BinaryReader)null)); } + [ConditionalFact(typeof(RemoteExecutor), nameof(RemoteExecutor.IsSupported))] + public void Current_FallsBackToThread() + { + RemoteExecutor.Invoke(() => + { + ClaimsPrincipal principal1 = new ClaimsPrincipal(); + ClaimsPrincipal principal2 = new ClaimsPrincipal(); + + Thread.CurrentPrincipal = principal1; + Assert.Same(principal1, ClaimsPrincipal.Current); + + Thread.CurrentPrincipal = principal2; + Assert.Same(principal2, ClaimsPrincipal.Current); + + NonClaimsIdentity id = new NonClaimsIdentity() { Name = "NonClaimsIdentity_Name" }; + NonClaimsPrincipal nonClaimsPrincipal = new NonClaimsPrincipal() { Identity = id }; + + Thread.CurrentPrincipal = nonClaimsPrincipal; + + ClaimsPrincipal current = ClaimsPrincipal.Current; + Assert.NotNull(current); + Assert.Equal("NonClaimsIdentity_Name", current.Identity.Name); + + // match .NET Framework behavior by throwing ArgumentNullException when Thread.CurrentPrincipal is null + Thread.CurrentPrincipal = null; + Assert.Throws(() => ClaimsPrincipal.Current); + }).Dispose(); + } + private class NonClaimsPrincipal : IPrincipal { public IIdentity Identity { get; set; } diff --git a/src/libraries/System.Security.Claims/tests/System.Security.Claims.Tests.csproj b/src/libraries/System.Security.Claims/tests/System.Security.Claims.Tests.csproj index cbdc509..74dc037 100644 --- a/src/libraries/System.Security.Claims/tests/System.Security.Claims.Tests.csproj +++ b/src/libraries/System.Security.Claims/tests/System.Security.Claims.Tests.csproj @@ -1,5 +1,6 @@ + true $(NetCoreAppCurrent)