diff --git a/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/Security/Claims/HttpContextCurrentPrincipalAccessor.cs b/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/Security/Claims/HttpContextCurrentPrincipalAccessor.cs index 601ea32021..717c578d33 100644 --- a/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/Security/Claims/HttpContextCurrentPrincipalAccessor.cs +++ b/framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/Security/Claims/HttpContextCurrentPrincipalAccessor.cs @@ -1,13 +1,21 @@ -using Microsoft.AspNetCore.Http; +using System.Security.Claims; +using Microsoft.AspNetCore.Http; using Volo.Abp.Security.Claims; namespace Volo.Abp.AspNetCore.Security.Claims { public class HttpContextCurrentPrincipalAccessor : ThreadCurrentPrincipalAccessor { + private readonly IHttpContextAccessor _httpContextAccessor; + public HttpContextCurrentPrincipalAccessor(IHttpContextAccessor httpContextAccessor) { - CurrentScope.Value = () => httpContextAccessor.HttpContext?.User ?? GetThreadClaimsPrincipal(); + _httpContextAccessor = httpContextAccessor; + } + + protected override ClaimsPrincipal GetClaimsPrincipal() + { + return _httpContextAccessor.HttpContext?.User ?? base.GetClaimsPrincipal(); } } } diff --git a/framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/ThreadCurrentPrincipalAccessor.cs b/framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/ThreadCurrentPrincipalAccessor.cs index f5d763705c..ad496ba916 100644 --- a/framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/ThreadCurrentPrincipalAccessor.cs +++ b/framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/ThreadCurrentPrincipalAccessor.cs @@ -1,43 +1,33 @@ using System; using System.Security.Claims; using System.Threading; -using System.Xml.Schema; using Volo.Abp.DependencyInjection; namespace Volo.Abp.Security.Claims { public class ThreadCurrentPrincipalAccessor : ICurrentPrincipalAccessor, ISingletonDependency { - public Guid Id = Guid.NewGuid(); + public ClaimsPrincipal Principal => _currentPrincipal.Value ?? GetClaimsPrincipal(); - public virtual ClaimsPrincipal Principal - { - get => CurrentScope.Value?.Invoke(); - set => CurrentScope.Value = () => value; - } + private readonly AsyncLocal _currentPrincipal = new AsyncLocal(); - protected readonly AsyncLocal> CurrentScope; - - public ThreadCurrentPrincipalAccessor() + protected virtual ClaimsPrincipal GetClaimsPrincipal() { - CurrentScope = new AsyncLocal> - { - Value = GetThreadClaimsPrincipal - }; + return Thread.CurrentPrincipal as ClaimsPrincipal; } - protected ClaimsPrincipal GetThreadClaimsPrincipal() + public virtual IDisposable Change(ClaimsPrincipal principal) { - return Thread.CurrentPrincipal as ClaimsPrincipal; + return SetCurrent(principal); } - public virtual IDisposable Change(ClaimsPrincipal principal) + private IDisposable SetCurrent(ClaimsPrincipal principal) { - var parentScope = Principal; - Principal = principal; + var parent = Principal; + _currentPrincipal.Value = principal; return new DisposeAction(() => { - Principal = parentScope; + _currentPrincipal.Value = parent; }); } } diff --git a/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.TestBase/Security/FakeCurrentPrincipalAccessor.cs b/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.TestBase/Security/FakeCurrentPrincipalAccessor.cs index ef00c20a24..5e6b064875 100644 --- a/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.TestBase/Security/FakeCurrentPrincipalAccessor.cs +++ b/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.TestBase/Security/FakeCurrentPrincipalAccessor.cs @@ -6,9 +6,13 @@ using Volo.Abp.Security.Claims; namespace MyCompanyName.MyProjectName.Security { [Dependency(ReplaceServices = true)] - public class FakeCurrentPrincipalAccessor : ICurrentPrincipalAccessor, ISingletonDependency + public class FakeCurrentPrincipalAccessor : ThreadCurrentPrincipalAccessor { - public ClaimsPrincipal Principal => GetPrincipal(); + protected override ClaimsPrincipal GetClaimsPrincipal() + { + return GetPrincipal(); + } + private ClaimsPrincipal _principal; private ClaimsPrincipal GetPrincipal() @@ -36,4 +40,4 @@ namespace MyCompanyName.MyProjectName.Security return _principal; } } -} \ No newline at end of file +} diff --git a/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.TestBase/Security/FakeCurrentPrincipalAccessor.cs b/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.TestBase/Security/FakeCurrentPrincipalAccessor.cs index 4196dd09e1..5e6b064875 100644 --- a/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.TestBase/Security/FakeCurrentPrincipalAccessor.cs +++ b/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.TestBase/Security/FakeCurrentPrincipalAccessor.cs @@ -6,9 +6,13 @@ using Volo.Abp.Security.Claims; namespace MyCompanyName.MyProjectName.Security { [Dependency(ReplaceServices = true)] - public class FakeCurrentPrincipalAccessor : ICurrentPrincipalAccessor, ISingletonDependency + public class FakeCurrentPrincipalAccessor : ThreadCurrentPrincipalAccessor { - public ClaimsPrincipal Principal => GetPrincipal(); + protected override ClaimsPrincipal GetClaimsPrincipal() + { + return GetPrincipal(); + } + private ClaimsPrincipal _principal; private ClaimsPrincipal GetPrincipal()