using System;
using System.Linq;
using System.Security.Claims;
using System.Threading;
using Abp.Configuration.Startup;
using Abp.Dependency;
using Abp.MultiTenancy;
using Abp.Runtime.Security;
namespace Abp.Runtime.Session
{
///
/// Implements to get session properties from current claims.
///
public class ClaimsAbpSession : AbpSessionBase, ISingletonDependency
{
public override long? UserId
{
get
{
if (OverridedValue != null)
{
return OverridedValue.UserId;
}
var userIdClaim = PrincipalAccessor.Principal?.Claims.FirstOrDefault(c => c.Type == AbpClaimTypes.UserId);
if (string.IsNullOrEmpty(userIdClaim?.Value))
{
return null;
}
long userId;
if (!long.TryParse(userIdClaim.Value, out userId))
{
return null;
}
return userId;
}
}
public override int? TenantId
{
get
{
if (!MultiTenancy.IsEnabled)
{
return MultiTenancyConsts.DefaultTenantId;
}
if (OverridedValue != null)
{
return OverridedValue.TenantId;
}
var tenantIdClaim = PrincipalAccessor.Principal?.Claims.FirstOrDefault(c => c.Type == AbpClaimTypes.TenantId);
if (!string.IsNullOrEmpty(tenantIdClaim?.Value))
{
return Convert.ToInt32(tenantIdClaim.Value);
}
if (UserId == null)
{
//Resolve tenant id from request only if user has not logged in!
return TenantResolver.ResolveTenantId();
}
return null;
}
}
public override long? ImpersonatorUserId
{
get
{
var impersonatorUserIdClaim = PrincipalAccessor.Principal?.Claims.FirstOrDefault(c => c.Type == AbpClaimTypes.ImpersonatorUserId);
if (string.IsNullOrEmpty(impersonatorUserIdClaim?.Value))
{
return null;
}
return Convert.ToInt64(impersonatorUserIdClaim.Value);
}
}
public override int? ImpersonatorTenantId
{
get
{
if (!MultiTenancy.IsEnabled)
{
return MultiTenancyConsts.DefaultTenantId;
}
var impersonatorTenantIdClaim = PrincipalAccessor.Principal?.Claims.FirstOrDefault(c => c.Type == AbpClaimTypes.ImpersonatorTenantId);
if (string.IsNullOrEmpty(impersonatorTenantIdClaim?.Value))
{
return null;
}
return Convert.ToInt32(impersonatorTenantIdClaim.Value);
}
}
protected IPrincipalAccessor PrincipalAccessor { get; }
protected ITenantResolver TenantResolver { get; }
public ClaimsAbpSession(
IPrincipalAccessor principalAccessor,
IMultiTenancyConfig multiTenancy,
ITenantResolver tenantResolver,
IAmbientScopeProvider sessionOverrideScopeProvider)
: base(
multiTenancy,
sessionOverrideScopeProvider)
{
TenantResolver = tenantResolver;
PrincipalAccessor = principalAccessor;
}
}
}