public static async Task LogoutAsync(string sessionToken) { await Authorization.CheckAuthorizationAsync(sessionToken, MethodBase.GetCurrentMethod(), AccessType.Query).ConfigureAwait(false); try { using var sessionCtrl = new Controllers.Persistence.Account.LoginSessionController(Factory.CreateContext()) { SessionToken = Authorization.SystemAuthorizationToken }; var session = await sessionCtrl.ExecuteFirstOrDefaultAsync(e => e.SessionToken.Equals(sessionToken)) .ConfigureAwait(false); if (session != null && session.IsActive) { session.LogoutTime = DateTime.Now; await sessionCtrl.UpdateAsync(session).ConfigureAwait(false); await sessionCtrl.SaveChangesAsync().ConfigureAwait(false); } var querySession = LoginSessions.SingleOrDefault(ls => ls.SessionToken.Equals(sessionToken)); if (querySession != null) { querySession.LogoutTime = session?.LogoutTime; } } catch (AuthorizationException ex) { System.Diagnostics.Debug.WriteLine($"Error in {MethodBase.GetCurrentMethod().Name}: {ex.Message}"); } }
internal static async Task <LoginSession> QueryAliveSessionAsync(string email, string password) { email.CheckArgument(nameof(email)); password.CheckArgument(nameof(password)); var result = LoginSessions.FirstOrDefault(e => e.IsActive && e.Email.Equals(email, StringComparison.CurrentCultureIgnoreCase)); if (result == null) { using var identityCtrl = new Controllers.Persistence.Account.IdentityController(Factory.CreateContext()) { SessionToken = Authorization.SystemAuthorizationToken, }; var identity = await identityCtrl.ExecuteFirstOrDefaultAsync(e => e.State == Contracts.Modules.Common.State.Active && e.AccessFailedCount < 4 && e.Email.ToLower() == email.ToLower()) .ConfigureAwait(false); if (identity != null && VerifyPasswordHash(password, identity.PasswordHash, identity.PasswordSalt)) { using var sessionCtrl = new Controllers.Persistence.Account.LoginSessionController(identityCtrl); var session = await sessionCtrl.ExecuteFirstOrDefaultAsync(e => e.LogoutTime == null && e.IdentityId == identity.Id) .ConfigureAwait(false); if (session != null && session.IsActive) { session.Identity = identity; session.Roles.AddRange(await QueryIdentityRolesAsync(sessionCtrl, identity.Id).ConfigureAwait(false)); session.JsonWebToken = JsonWebToken.GenerateToken(new Claim[] { new Claim(ClaimTypes.Email, identity.Email), new Claim(ClaimTypes.System, nameof(QnSProjectAward)), }.Union(session.Roles.Select(e => new Claim(ClaimTypes.Role, e.Designation)))); result = new LoginSession(); result.CopyProperties(session); LoginSessions.Add(session); } } } return(result); }
internal static async Task <LoginSession> QueryAliveSessionAsync(string sessionToken) { LoginSession result = LoginSessions.FirstOrDefault(ls => ls.IsActive && ls.SessionToken.Equals(sessionToken)); if (result == null) { using var sessionCtrl = new Controllers.Persistence.Account.LoginSessionController(Factory.CreateContext()) { SessionToken = Authorization.SystemAuthorizationToken }; var session = await sessionCtrl.ExecuteFirstOrDefaultAsync(e => e.SessionToken.Equals(sessionToken)) .ConfigureAwait(false); if (session != null && session.IsActive) { using var identityCtrl = new Controllers.Persistence.Account.IdentityController(sessionCtrl); var identity = await identityCtrl.ExecuteFirstOrDefaultAsync(e => e.Id == session.IdentityId) .ConfigureAwait(false); if (identity != null) { session.Name = identity.Name; session.Email = identity.Email; session.Roles.AddRange(await QueryIdentityRolesAsync(sessionCtrl, identity.Id).ConfigureAwait(false)); session.JsonWebToken = JsonWebToken.GenerateToken(new Claim[] { new Claim(ClaimTypes.Email, identity.Email), new Claim(ClaimTypes.System, nameof(QnSProjectAward)), }.Union(session.Roles.Select(e => new Claim(ClaimTypes.Role, e.Designation)))); result = new LoginSession(); result.CopyProperties(session); LoginSessions.Add(session); } } } return(result); }
private static Task UpdateSessionAysnc() { return(Task.Run(async() => { while (true) { try { using var sessionCtrl = new Controllers.Persistence.Account.LoginSessionController(Factory.CreateContext()) { SessionToken = Authorization.SystemAuthorizationToken, }; bool saveChanges = false; var dbSessions = await sessionCtrl.QueryOpenLoginSessionsAsync() .ConfigureAwait(false); var uncheckSessions = LoginSessions.Where(i => dbSessions.Any() == false || dbSessions.Any(e => e.Id != i.Id)); foreach (var dbItem in dbSessions) { var itemUpdate = false; var memItemRemove = false; var memItem = LoginSessions.FirstOrDefault(e => e.Id == dbItem.Id); if (memItem != null && memItem.HasChanged) { itemUpdate = true; memItem.HasChanged = false; dbItem.LastAccess = memItem.LastAccess; } if (dbItem.IsTimeout) { itemUpdate = true; if (memItem != null) { memItemRemove = true; } if (dbItem.LogoutTime.HasValue == false) { dbItem.LogoutTime = DateTime.Now; } } if (itemUpdate) { saveChanges = true; await sessionCtrl.ExecuteUpdateAsync(dbItem).ConfigureAwait(false); } if (memItemRemove) { LoginSessions.Remove(memItem); } } if (saveChanges) { await sessionCtrl.SaveChangesAsync().ConfigureAwait(false); } foreach (var memItem in uncheckSessions) { var dbItem = await sessionCtrl.ExecuteFirstOrDefaultAsync(e => e.Id == memItem.Id) .ConfigureAwait(false); if (dbItem != null) { memItem.LastAccess = dbItem.LastAccess; memItem.LogoutTime = dbItem.LogoutTime; } } } catch (System.Exception ex) { System.Diagnostics.Debug.WriteLine($"Error in {MethodBase.GetCurrentMethod().Name}: {ex.Message}"); } LastLoginUpdate = DateTime.Now; await Task.Delay(UpdateDelay).ConfigureAwait(false); } })); }