public async Task TerminateSession(Session userInfo, SessionActivityType reason) { await sessionRepository.Remove(userInfo.SessionId, userInfo.UserName, userInfo.AccountId); if (reason != SessionActivityType.SignOut) { foreach (var accessToken in userInfo.AccessTokens) { await tokenRevocationService.RevokeAccessToken(accessToken, userInfo.ClientId); } } await notificationService.PublishSessionTermination(new TerminateSessionNotification() { SessionId = userInfo.SessionId, Reason = reason }); if (!userInfo.IsSupportUser) { await activityService.PublishActivity(userInfo, reason); } else if (!string.IsNullOrEmpty(userInfo.AccountId)) { await MakeAndPublishOnBehalfActivity(SessionActivityType.OnBehalfSupportDisconnected, userInfo); } }
private async Task MakeAndPublishOnBehalfActivity(SessionActivityType type, Session session) { var accountOwner = await accountsService.GetAccountOwnerUserName(session.AccountId); var sessionActivity = new SessionActivity(type, session.SessionId, accountOwner, session.AccountId); await activityService.PublishActivity(sessionActivity); }
public async Task <TerminateSessionResponse> TerminateSession( string userName, string accountId, bool isSupportUser, SessionActivityType reason = SessionActivityType.ManualTermination) { await slimLock.WaitAsync(); try { var userInfo = await sessionRepository.GetByUser(userName); if (userInfo == null && !isSupportUser && !string.IsNullOrEmpty(accountId)) { userInfo = await sessionRepository.GetByAccount(accountId); } if (userInfo == null) { return(new TerminateSessionResponse { Status = TerminateSessionStatus.NotFound, ErrorMessage = $"No session found for the user: [{userName}] and account: [{accountId}]" }); } logger.LogInformation($"Terminating session: [{userInfo.SessionId}] for user: [{userName}] and account: [{accountId}]"); await TerminateSession(userInfo, reason); if (reason == SessionActivityType.ManualTermination) { logger.LogWarning(StatusCode.WN_ATH_701.ToMessage()); } logger.LogInformation($"Successfully terminated session: [{userInfo.SessionId}] for user: [{userName}] and account: [{accountId}]"); return(new TerminateSessionResponse { Status = TerminateSessionStatus.Terminated, UserSessionId = userInfo.SessionId }); } catch (Exception error) { logger.LogError(error, $"An unexpected error occurred while terminating session for user [{userName}] and account: [{accountId}]"); return(new TerminateSessionResponse { Status = TerminateSessionStatus.Failed, ErrorMessage = "An unknown error occurred while terminating user session" }); } finally { slimLock.Release(); } }
public SessionActivity( SessionActivityType type, int sessionId, string userName, string accountId) { Type = type; SessionId = sessionId; UserName = userName ?? throw new ArgumentNullException(nameof(userName)); AccountId = accountId; }
public static TerminateConnectionReason ToTerminateConnectionReason(this SessionActivityType activityType) { switch (activityType) { case SessionActivityType.DifferentDeviceTermination: return(TerminateConnectionReason.DifferentDevice); case SessionActivityType.ManualTermination: return(TerminateConnectionReason.ByForce); default: return(TerminateConnectionReason.Other); } }
public Task PublishActivity(Session session, SessionActivityType activityType) { var activity = new SessionActivity(activityType, session.SessionId, session.UserName, session.AccountId); return(PublishActivity(activity)); }