/// <summary> /// Read from database if this user is registered and authorized to login /// </summary> /// <param name="requset"></param> /// <returns></returns> internal async Task <LoginResposeModel> AuthorizeFromDatabase(LoginRequsetModel requset) { LoginResposeModel result = new LoginResposeModel(); //Since plain-text password is not saved in db, then it has to be hashed to find it in db var hashedPassword = await GetHashedPassword(requset.Username, requset.Password); IsError = string.IsNullOrEmpty(hashedPassword); try { if (!IsError) { _signedInUser = _userRepository.GetUser(requset.Username, hashedPassword); result.IsAuthorized = _signedInUser != null; result.UserLevel = _signedInUser.UserLevel; } } catch (Exception e) { IsError = true; _logger.Error(e, "Failed to get user record"); } return(result); }
/// <summary> /// Login user implementation /// </summary> /// <param name="request"></param> /// <returns></returns> public async Task <LoginResposeModel> LoginUser(LoginRequsetModel request) { LoginResposeModel result = new LoginResposeModel(); //Try to get from the cache first result = AuthorizeFromCache(request); //If not available, search from db if (!result.IsAuthorized) { result = await AuthorizeFromDatabase(request); } //Prepare response and cache it if (result.IsAuthorized && !IsError) { result.Success = true; result.LastActiveTime = DateTimeOffset.UtcNow; result.Username = request.Username; if (string.IsNullOrEmpty(result.AccessToken)) { result.AccessToken = CreateAccessToken(request.Username); result.FirstActiveTime = DateTimeOffset.UtcNow; } _cacheManagement.SetOnly(request.Username, result); } return(result); }
/// <summary> /// Read from the cache if the user is still logged in /// </summary> /// <param name="requset"></param> /// <returns></returns> internal LoginResposeModel AuthorizeFromCache(LoginRequsetModel requset) { LoginResposeModel result = new LoginResposeModel(); var cachedItem = _cacheManagement.GetOnly(requset.Username) as LoginResposeModel; if (cachedItem != null) { result = cachedItem; } return(result); }
/// <summary> /// When logout, Remove the logged in user from the cache /// </summary> /// <param name="request"></param> /// <returns></returns> public Task <LoginResposeModel> LogoutUser(LoginRequsetModel request) { var result = new LoginResposeModel(); try { _cacheManagement.Expire(request.Username); result.Success = true; } catch (Exception e) { IsError = true; _logger.Error(e, "Failed to logout user"); } return(Task.FromResult(result)); }