Exemple #1
0
        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);
            }
        }
Exemple #2
0
        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);
        }
Exemple #3
0
        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;
 }
Exemple #5
0
        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);
            }
        }
Exemple #6
0
        public Task PublishActivity(Session session, SessionActivityType activityType)
        {
            var activity = new SessionActivity(activityType, session.SessionId, session.UserName, session.AccountId);

            return(PublishActivity(activity));
        }