5 changed files with 83 additions and 93 deletions
@ -1,75 +0,0 @@ |
|||
using LINGYUN.Abp.Identity.Settings; |
|||
using Microsoft.Extensions.Logging; |
|||
using Microsoft.Extensions.Logging.Abstractions; |
|||
using System; |
|||
using System.Threading.Tasks; |
|||
using Volo.Abp.Caching; |
|||
using Volo.Abp.DependencyInjection; |
|||
using Volo.Abp.Domain.Entities.Events; |
|||
using Volo.Abp.EventBus; |
|||
using Volo.Abp.Identity; |
|||
using Volo.Abp.Settings; |
|||
|
|||
namespace LINGYUN.Abp.Identity.Session; |
|||
public class IdentitySessionEntityCreatedEventHandler : |
|||
ILocalEventHandler<EntityCreatedEventData<IdentitySession>>, |
|||
ITransientDependency |
|||
{ |
|||
public ILogger<IdentitySessionEntityCreatedEventHandler> Logger { protected get; set; } |
|||
|
|||
private readonly ISettingProvider _settingProvider; |
|||
private readonly IIdentitySessionStore _identitySessionStore; |
|||
private readonly IDistributedCache<IdentitySessionCacheItem> _identitySessionCache; |
|||
|
|||
public IdentitySessionEntityCreatedEventHandler( |
|||
ISettingProvider settingProvider, |
|||
IIdentitySessionStore identitySessionStore, |
|||
IDistributedCache<IdentitySessionCacheItem> identitySessionCache) |
|||
{ |
|||
_settingProvider = settingProvider; |
|||
_identitySessionStore = identitySessionStore; |
|||
_identitySessionCache = identitySessionCache; |
|||
|
|||
Logger = NullLogger<IdentitySessionEntityCreatedEventHandler>.Instance; |
|||
} |
|||
|
|||
public async virtual Task HandleEventAsync(EntityCreatedEventData<IdentitySession> eventData) |
|||
{ |
|||
// 创建一个会话后根据策略使其他会话失效
|
|||
var strategySet = await _settingProvider.GetOrNullAsync(IdentitySettingNames.Session.ConcurrentLoginStrategy); |
|||
|
|||
Logger.LogDebug($"The concurrent login strategy is: {strategySet}"); |
|||
|
|||
if (!strategySet.IsNullOrWhiteSpace() && Enum.TryParse<ConcurrentLoginStrategy>(strategySet, true, out var strategy)) |
|||
{ |
|||
switch (strategy) |
|||
{ |
|||
// 限制用户相同设备
|
|||
case ConcurrentLoginStrategy.LogoutFromSameTypeDevicesLimit: |
|||
var sameTypeDevicesCountSet = await _settingProvider.GetAsync(IdentitySettingNames.Session.LogoutFromSameTypeDevicesLimit, 1); |
|||
Logger.LogDebug($"Clear other sessions on the device {eventData.Entity.Device} and save only {sameTypeDevicesCountSet} sessions."); |
|||
await _identitySessionStore.RevokeWithAsync( |
|||
eventData.Entity.UserId, |
|||
eventData.Entity.Device, |
|||
eventData.Entity.Id, |
|||
sameTypeDevicesCountSet); |
|||
break; |
|||
// 限制登录设备
|
|||
case ConcurrentLoginStrategy.LogoutFromSameTypeDevices: |
|||
Logger.LogDebug($"Clear all other sessions on the device {eventData.Entity.Device}."); |
|||
await _identitySessionStore.RevokeAllAsync( |
|||
eventData.Entity.UserId, |
|||
eventData.Entity.Device, |
|||
eventData.Entity.Id); |
|||
break; |
|||
// 限制多端登录
|
|||
case ConcurrentLoginStrategy.LogoutFromAllDevices: |
|||
Logger.LogDebug($"Clear all other user sessions."); |
|||
await _identitySessionStore.RevokeAllAsync( |
|||
eventData.Entity.UserId, |
|||
eventData.Entity.Id); |
|||
break; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
Loading…
Reference in new issue