UserSessionRevoker

This commit is contained in:
Artemy
2025-07-24 18:05:11 +07:00
parent 15f9370dbe
commit 6a6c3d513d
4 changed files with 68 additions and 3 deletions
@@ -89,6 +89,7 @@ public static class ConfigurationProgramExtensions
services.AddScoped<IHubUserAccessor, HubUserAccessor>(); services.AddScoped<IHubUserAccessor, HubUserAccessor>();
services.AddScoped<IUserSessionReader, UserSessionReader>(); services.AddScoped<IUserSessionReader, UserSessionReader>();
services.AddScoped<IUserSessionRevoker, UserSessionRevoker>();
} }
public static void AddRepositories(this IServiceCollection services) public static void AddRepositories(this IServiceCollection services)
+1 -1
View File
@@ -12,7 +12,7 @@
"AllowedHosts": "govor-team-govor-88b3.twc1.net;localhost;localhost:7155", "AllowedHosts": "govor-team-govor-88b3.twc1.net;localhost;localhost:7155",
"JwtAccessOption": { "JwtAccessOption": {
"SecretKey": "Q89eY7zP7C4+TqLmHF4kw9xkF1E8Ru4Zpg+up9wFt9g=", "SecretKey": "Q89eY7zP7C4+TqLmHF4kw9xkF1E8Ru4Zpg+up9wFt9g=",
"Minutes": 25 "Minutes": 5
}, },
"JwtRefreshOption": { "JwtRefreshOption": {
"RefreshTokenLifetimeDays": 30 "RefreshTokenLifetimeDays": 30
@@ -23,11 +23,12 @@ public class UserSessionReader : IUserSessionReader
{ {
_logger.LogInformation($"Getting all sessions for user {userId}"); _logger.LogInformation($"Getting all sessions for user {userId}");
var sessions = await _repository.GetByUserIdAsync(userId); var sessions = await _repository.GetByUserIdAsync(userId);
return sessions;
return sessions.Where(f => !f.IsRevoked).ToList() ?? [];
} }
catch (NotFoundByKeyException<Guid> ex) catch (NotFoundByKeyException<Guid> ex)
{ {
_logger.LogWarning("The user has no active sessions."); _logger.LogWarning("The user has no sessions.");
return []; return [];
} }
} }
@@ -0,0 +1,63 @@
using Govor.Application.Interfaces.UserSession;
using Govor.Core.Repositories.UserSessionsRepository;
using Govor.Data.Repositories.Exceptions;
using Microsoft.Extensions.Logging;
namespace Govor.Application.Services.UserSessions;
public class UserSessionRevoker : IUserSessionRevoker
{
private readonly IUserSessionsRepository _sessionsRepository;
private readonly ILogger<UserSessionRevoker> _logger;
public UserSessionRevoker(IUserSessionsRepository sessionsRepository, ILogger<UserSessionRevoker> logger)
{
_sessionsRepository = sessionsRepository;
_logger = logger;
}
public async Task CloseSessionByIdAsync(Guid sessionId, Guid userId)
{
try
{
var session = await _sessionsRepository.GetByIdAsync(sessionId);
if (session.UserId != userId)
{
_logger.LogWarning("User {userId} does not belong to this session {sessionId}", userId, sessionId);
throw new UnauthorizedAccessException($"User {userId} does not belong to this session {sessionId}");
}
if(session.IsRevoked) return;
session.IsRevoked = true;
await _sessionsRepository.UpdateAsync(session);
}
catch (NotFoundByKeyException<Guid> ex)
{
_logger.LogWarning("User {userId} tried close unreal session!", userId);
throw new NotFoundException("Session not found", ex);
}
}
public async Task CloseAllSessionsAsync(Guid userId)
{
try
{
var sessions = await _sessionsRepository.GetByUserIdAsync(userId);
foreach (var session in sessions)
{
if(session.IsRevoked) continue;
session.IsRevoked = true;
await _sessionsRepository.UpdateAsync(session);
}
}
catch (NotFoundByKeyException<Guid> ex)
{
_logger.LogWarning("User {userId} has not sessions", userId);
throw new NotFoundException("Session not found", ex);
}
}
}