private async Task <UserAndIdentity> GetUserAndIdentity(ImpersonationCacheItem cacheItem, string impersonationToken) { var user = await _userManager.FindByIdAsync(cacheItem.TargetUserId.ToString()); //Create identity var identity = (ClaimsIdentity)(await _principalFactory.CreateAsync(user)).Identity; if (!cacheItem.IsBackToImpersonator) { //Add claims for audit logging if (cacheItem.ImpersonatorTenantId.HasValue) { identity.AddClaim(new Claim(AbpClaimTypes.ImpersonatorTenantId, cacheItem.ImpersonatorTenantId.Value.ToString(CultureInfo.InvariantCulture))); } identity.AddClaim(new Claim(AbpClaimTypes.ImpersonatorUserId, cacheItem.ImpersonatorUserId.ToString(CultureInfo.InvariantCulture))); } //Remove the cache item to prevent re-use await _cacheManager.GetImpersonationCache().RemoveAsync(impersonationToken); return(new UserAndIdentity(user, identity)); }
private async Task <string> GenerateImpersonationTokenAsync(int?tenantId, long userId, bool isBackToImpersonator) { //Create a cache item var cacheItem = new ImpersonationCacheItem( tenantId, userId, isBackToImpersonator ); if (!isBackToImpersonator) { cacheItem.ImpersonatorTenantId = AbpSession.TenantId; cacheItem.ImpersonatorUserId = AbpSession.GetUserId(); } //Create a random token and save to the cache var token = Guid.NewGuid().ToString(); await _cacheManager .GetImpersonationCache() .SetAsync(token, cacheItem, TimeSpan.FromMinutes(1)); return(token); }