From be26d3f4615c6cf20920c3ca6c164701c332ec65 Mon Sep 17 00:00:00 2001 From: Tygozwolle Date: Fri, 24 Jul 2026 20:07:16 +0200 Subject: [PATCH] feat: add account enforcement background service and radius management service for automated session control and user configuration --- radiuscontroller/Services/AccountEnforcementService.cs | 6 ++++-- radiuscontroller/Services/RadiusService.cs | 6 ++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/radiuscontroller/Services/AccountEnforcementService.cs b/radiuscontroller/Services/AccountEnforcementService.cs index de20b74..50a33af 100644 --- a/radiuscontroller/Services/AccountEnforcementService.cs +++ b/radiuscontroller/Services/AccountEnforcementService.cs @@ -107,7 +107,7 @@ public class AccountEnforcementService : BackgroundService // Find active sessions to disconnect them instantly via RADIUS CoA (PoD) var activeSessions = await db.RadAcct .Where(ra => ra.Username == profile.Username && ra.AcctStopTime == null) - .Select(ra => new { ra.NasIpAddress, ra.CallingStationId, ra.AcctSessionId }) + .Select(ra => new { ra.NasIpAddress, ra.CallingStationId, ra.AcctSessionId, ra.CalledStationId }) .ToListAsync(ct); var radiusSecret = Environment.GetEnvironmentVariable("RADIUS_SECRET") ?? "radpass"; @@ -118,7 +118,9 @@ public class AccountEnforcementService : BackgroundService try { - var payload = $"User-Name=\\\"{profile.Username}\\\"\\nCalling-Station-Id=\\\"{session.CallingStationId}\\\"\\nAcct-Session-Id=\\\"{session.AcctSessionId}\\\"\\nNAS-IP-Address=\\\"{session.NasIpAddress}\\\"\\nMessage-Authenticator=0x00\\n"; + var timestamp = DateTimeOffset.UtcNow.ToUnixTimeSeconds(); + var nasIdentifier = string.IsNullOrWhiteSpace(session.CalledStationId) ? "" : session.CalledStationId.Split(':')[0].Replace("-", "").ToLowerInvariant(); + var payload = $"User-Name=\\\"{profile.Username}\\\"\\nCalling-Station-Id=\\\"{session.CallingStationId}\\\"\\nAcct-Session-Id=\\\"{session.AcctSessionId}\\\"\\nNAS-IP-Address=\\\"{session.NasIpAddress}\\\"\\nNAS-Identifier=\\\"{nasIdentifier}\\\"\\nEvent-Timestamp={timestamp}\\n"; var process = new System.Diagnostics.Process { StartInfo = new System.Diagnostics.ProcessStartInfo diff --git a/radiuscontroller/Services/RadiusService.cs b/radiuscontroller/Services/RadiusService.cs index 4b2cc04..5c3822f 100644 --- a/radiuscontroller/Services/RadiusService.cs +++ b/radiuscontroller/Services/RadiusService.cs @@ -379,7 +379,7 @@ public class RadiusService : IRadiusService { var activeSessions = await _db.RadAcct .Where(ra => ra.Username == username && ra.AcctStopTime == null) - .Select(ra => new { ra.NasIpAddress, ra.CallingStationId, ra.AcctSessionId }) + .Select(ra => new { ra.NasIpAddress, ra.CallingStationId, ra.AcctSessionId, ra.CalledStationId }) .ToListAsync(); var radiusSecret = Environment.GetEnvironmentVariable("RADIUS_SECRET") ?? "radpass"; @@ -390,7 +390,9 @@ public class RadiusService : IRadiusService try { - var payload = $"User-Name=\\\"{username}\\\"\\nCalling-Station-Id=\\\"{session.CallingStationId}\\\"\\nAcct-Session-Id=\\\"{session.AcctSessionId}\\\"\\nNAS-IP-Address=\\\"{session.NasIpAddress}\\\"\\nMessage-Authenticator=0x00\\n"; + var timestamp = DateTimeOffset.UtcNow.ToUnixTimeSeconds(); + var nasIdentifier = string.IsNullOrWhiteSpace(session.CalledStationId) ? "" : session.CalledStationId.Split(':')[0].Replace("-", "").ToLowerInvariant(); + var payload = $"User-Name=\\\"{username}\\\"\\nCalling-Station-Id=\\\"{session.CallingStationId}\\\"\\nAcct-Session-Id=\\\"{session.AcctSessionId}\\\"\\nNAS-IP-Address=\\\"{session.NasIpAddress}\\\"\\nNAS-Identifier=\\\"{nasIdentifier}\\\"\\nEvent-Timestamp={timestamp}\\n"; var process = new System.Diagnostics.Process { StartInfo = new System.Diagnostics.ProcessStartInfo