Browse Source

Refactoring ICurrentPrincipalAccessor.

pull/3918/head
maliming 6 years ago
parent
commit
441e18e2f4
  1. 12
      framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/Security/Claims/HttpContextCurrentPrincipalAccessor.cs
  2. 30
      framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/ThreadCurrentPrincipalAccessor.cs
  3. 10
      templates/app/aspnet-core/test/MyCompanyName.MyProjectName.TestBase/Security/FakeCurrentPrincipalAccessor.cs
  4. 8
      templates/module/aspnet-core/test/MyCompanyName.MyProjectName.TestBase/Security/FakeCurrentPrincipalAccessor.cs

12
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; using Volo.Abp.Security.Claims;
namespace Volo.Abp.AspNetCore.Security.Claims namespace Volo.Abp.AspNetCore.Security.Claims
{ {
public class HttpContextCurrentPrincipalAccessor : ThreadCurrentPrincipalAccessor public class HttpContextCurrentPrincipalAccessor : ThreadCurrentPrincipalAccessor
{ {
private readonly IHttpContextAccessor _httpContextAccessor;
public HttpContextCurrentPrincipalAccessor(IHttpContextAccessor httpContextAccessor) public HttpContextCurrentPrincipalAccessor(IHttpContextAccessor httpContextAccessor)
{ {
CurrentScope.Value = () => httpContextAccessor.HttpContext?.User ?? GetThreadClaimsPrincipal(); _httpContextAccessor = httpContextAccessor;
}
protected override ClaimsPrincipal GetClaimsPrincipal()
{
return _httpContextAccessor.HttpContext?.User ?? base.GetClaimsPrincipal();
} }
} }
} }

30
framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/ThreadCurrentPrincipalAccessor.cs

@ -1,43 +1,33 @@
using System; using System;
using System.Security.Claims; using System.Security.Claims;
using System.Threading; using System.Threading;
using System.Xml.Schema;
using Volo.Abp.DependencyInjection; using Volo.Abp.DependencyInjection;
namespace Volo.Abp.Security.Claims namespace Volo.Abp.Security.Claims
{ {
public class ThreadCurrentPrincipalAccessor : ICurrentPrincipalAccessor, ISingletonDependency public class ThreadCurrentPrincipalAccessor : ICurrentPrincipalAccessor, ISingletonDependency
{ {
public Guid Id = Guid.NewGuid(); public ClaimsPrincipal Principal => _currentPrincipal.Value ?? GetClaimsPrincipal();
public virtual ClaimsPrincipal Principal private readonly AsyncLocal<ClaimsPrincipal> _currentPrincipal = new AsyncLocal<ClaimsPrincipal>();
{
get => CurrentScope.Value?.Invoke();
set => CurrentScope.Value = () => value;
}
protected readonly AsyncLocal<Func<ClaimsPrincipal>> CurrentScope; protected virtual ClaimsPrincipal GetClaimsPrincipal()
public ThreadCurrentPrincipalAccessor()
{ {
CurrentScope = new AsyncLocal<Func<ClaimsPrincipal>> return Thread.CurrentPrincipal as ClaimsPrincipal;
{
Value = GetThreadClaimsPrincipal
};
} }
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; var parent = Principal;
Principal = principal; _currentPrincipal.Value = principal;
return new DisposeAction(() => return new DisposeAction(() =>
{ {
Principal = parentScope; _currentPrincipal.Value = parent;
}); });
} }
} }

10
templates/app/aspnet-core/test/MyCompanyName.MyProjectName.TestBase/Security/FakeCurrentPrincipalAccessor.cs

@ -6,9 +6,13 @@ using Volo.Abp.Security.Claims;
namespace MyCompanyName.MyProjectName.Security namespace MyCompanyName.MyProjectName.Security
{ {
[Dependency(ReplaceServices = true)] [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 _principal;
private ClaimsPrincipal GetPrincipal() private ClaimsPrincipal GetPrincipal()
@ -36,4 +40,4 @@ namespace MyCompanyName.MyProjectName.Security
return _principal; return _principal;
} }
} }
} }

8
templates/module/aspnet-core/test/MyCompanyName.MyProjectName.TestBase/Security/FakeCurrentPrincipalAccessor.cs

@ -6,9 +6,13 @@ using Volo.Abp.Security.Claims;
namespace MyCompanyName.MyProjectName.Security namespace MyCompanyName.MyProjectName.Security
{ {
[Dependency(ReplaceServices = true)] [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 _principal;
private ClaimsPrincipal GetPrincipal() private ClaimsPrincipal GetPrincipal()

Loading…
Cancel
Save