Esempio n. 1
0
        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}");
            }
        }
Esempio n. 2
0
        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);
        }
Esempio n. 3
0
        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);
        }
Esempio n. 4
0
        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);
                }
            }));
        }