public void CanGetEncryptedTokenTest() { IMateDAO <Mate> MateDAO = new MateDAO(_connection); Mate testMate = new Mate(); testMate.FirstName = "Miguel"; testMate.LastName = "Dev"; testMate.UserName = "******"; testMate.Password = "******"; testMate.Email = "*****@*****.**"; testMate.Description = "Lorem Ipsum is simply dummy text of the printing and typesetting industry."; testMate.Address = "Figueiró"; testMate.Categories = new[] { Categories.CLEANING, Categories.PLUMBING }; testMate.Rank = Ranks.SUPER_MATE; testMate.Range = 20; Mate returned = MateDAO.Create(testMate); string refreshToken = RefreshTokenHelper.generateRefreshToken(); RefreshTokenDAO refreshTokenDAO = new RefreshTokenDAO(_connection); refreshTokenDAO.saveEncryptedRefreshToken(refreshToken, returned.Email); EncryptedRefreshTokenModel returnedToken = refreshTokenDAO.GetEncryptedRefreshTokenModel(returned.Email); Assert.Equal(returned.Email, returnedToken.Email); Assert.True(PasswordOperations.VerifyHash(refreshToken, returnedToken.Hash, returnedToken.Salt)); _fixture.Dispose(); }
public JsonResult Refresh([FromBody] AppTokenModel refreshModel) { var token = refreshModel.AccessToken; var refreshToken = refreshModel.RefreshToken; var principal = JwtHelper.GetPrincipalFromExpiredToken(token); var username = principal.Identity.Name; var savedRefreshToken = _refreshTokenRepository.Get(username); //retrieve the refresh token from a data store if (savedRefreshToken != refreshToken) { throw new SecurityTokenException("Invalid refresh token"); } var newJwtToken = JwtHelper.GenerateToken(principal.Claims); var newRefreshToken = RefreshTokenHelper.GenerateRefreshToken(); _refreshTokenRepository.Delete(username, refreshToken); _refreshTokenRepository.Save(username, newRefreshToken); return(Json(new AppTokenModel { AccessToken = newJwtToken, RefreshToken = newRefreshToken })); }
public void Refresh_token_expire_before_31_days() { const int mockUserId = 31; var refreshToken = RefreshTokenHelper.Generate(mockUserId); Assert.False(refreshToken.ExpirationDate < DateTime.Today.AddDays(30)); }
public IActionResult Refresh([FromBody] RefreshTokenModel refreshToken) { try { var principal = GetPrincipalFromExpiredToken(refreshToken.Token); var username = principal.Identity.Name; var savedRefreshToken = ""; savedRefreshToken = _userService.GetUserRefreshToken(username); //retrieve the refresh token from a data store if (savedRefreshToken != refreshToken.RefreshToken) { return(Ok(new { Status = PublicResultStatusCodes.NotAuthorized })); } var newJwtToken = _jwtTokenGenerator.GenerateAccessTokenWithClaimsPrincipal(username, principal.Claims); var newRefreshToken = RefreshTokenHelper.GenerateRefreshToken(); _userService.SaveUserRefreshToken(username, newRefreshToken); return(Ok(new { Status = PublicResultStatusCodes.Done, Data = new List <object> { new{ RefreshToken = newRefreshToken, Token = newJwtToken.AccessToken, ValidTokenTimeInMinutes = _token.ValidTimeInMinutes, ValidDateTimeToken = DateTime.Now.AddMinutes(_token.ValidTimeInMinutes) } } })); } catch (SecurityTokenException ex) { return(Ok(new { Status = PublicResultStatusCodes.NotAuthorized })); } }
public void ReturnExceptionWhenEmailDontExistSaveEncryptTokenTest() { IMateDAO <Mate> MateDAO = new MateDAO(_connection); Mate testMate = new Mate(); testMate.FirstName = "Miguel"; testMate.LastName = "Dev"; testMate.UserName = "******"; testMate.Password = "******"; testMate.Email = "*****@*****.**"; testMate.Description = "Lorem Ipsum is simply dummy text of the printing and typesetting industry."; testMate.Address = "Figueiró"; testMate.Categories = new[] { Categories.CLEANING, Categories.PLUMBING }; testMate.Rank = Ranks.SUPER_MATE; testMate.Range = 20; Mate returned = MateDAO.Create(testMate); string refreshToken = RefreshTokenHelper.generateRefreshToken(); RefreshTokenDAO refreshTokenDAO = new RefreshTokenDAO(_connection); Assert.Throws <Exception>(() => refreshTokenDAO.saveEncryptedRefreshToken(refreshToken, "*****@*****.**")); _fixture.Dispose(); }
public JsonResult Token([FromBody] Form form) { var username = form.UserName; var password = form.Password; var identity = GetIdentity(username, password); if (identity == null) { Response.StatusCode = (int)HttpStatusCode.BadRequest; return(Json("Invalid username or password.")); } var encodedJwt = JwtHelper.GenerateToken(identity.Claims); var refreshToken = RefreshTokenHelper.GenerateRefreshToken(); _refreshTokenRepository.Delete(username); _refreshTokenRepository.Save(username, refreshToken); var response = new AppTokenModel { AccessToken = encodedJwt, RefreshToken = refreshToken, Username = identity.Name }; return(Json(response)); }
public void Refresh_token_expire_after_31_days() { const int mockUserId = 22; var refreshToken = RefreshTokenHelper.Generate(mockUserId); Assert.True(refreshToken.ExpirationDate < DateTime.Now.AddDays(31)); }
public static async Task <TokensAuthenticationModel> UpdateRefreshToken( this TokensAuthenticationModel tokensAuthenticationModel, string userName, RefreshTokenHelper refreshTokenHelper) { tokensAuthenticationModel.RefreshToken = await refreshTokenHelper.Update(tokensAuthenticationModel, userName); return(tokensAuthenticationModel); }
async Task ReloadData() { #region 讀取 相關定義資料 using (IProgressDialog fooIProgressDialog = UserDialogs.Instance.Loading($"請稍後,更新資料中...", null, null, true, MaskType.Black)) { await AppStatusHelper.ReadAndUpdateAppStatus(systemStatusService, appStatus); #region 檢查 Access Token 是否還可以使用 bool refreshTokenResult = await RefreshTokenHelper .CheckAndRefreshToken(dialogService, refreshTokenService, systemStatusService, appStatus); if (refreshTokenResult == false) { return; } #endregion #region 取得 專案清單 fooIProgressDialog.Title = "請稍後,取得 專案清單"; var apiResultssss = await projectService.GetAsync(); if (apiResultssss.Status == true) { await projectService.WriteToFileAsync(); } else { await DialogHelper.ShowAPIResultIsFailureMessage(dialogService, apiResultssss); return; } #endregion #region 取得 工作日誌明細 fooIProgressDialog.Title = "請稍後,取得 工作日誌明細"; apiResultssss = await workingLogDetailService.GetAsync(MasterItem.Id); if (apiResultssss.Status == true) { await workingLogDetailService.WriteToFileAsync(); await RefreshData(); } else { await DialogHelper.ShowAPIResultIsFailureMessage(dialogService, apiResultssss); return; } #endregion } #endregion }
public static async Task <TokensAuthenticationModel> AddRefreshTokenFields( this TokensAuthenticationModel tokensAuthenticationModel, string userName, RefreshTokenHelper refreshTokenHelper) { var loginProvider = Guid.NewGuid().ToString(); tokensAuthenticationModel.LoginProvider = loginProvider; tokensAuthenticationModel.RefreshToken = await refreshTokenHelper.Add(userName, loginProvider); return(tokensAuthenticationModel); }
public IActionResult Authenticate([FromBody] User userParam) { var user = _userService.Authenticate(userParam.EmailId, userParam.Password); //authentication if (user != null) { RefreshTokenHelper refToken = new RefreshTokenHelper(); user.Token = jwtHelper.Generate_Access_Token(user); //access token creation var refreshToken = refToken.Generate_Refresh_Token(); //Refresh token creation context.StoreRefreshToken(refreshToken, user.UserId, user.Token); //refresh token store in DB } return(Ok(user)); }
public async Task <AuthenticationTokens> GenerateTokens(int userId) { var tokenHandler = new JwtSecurityTokenHandler(); var accessToken = tokenHandler.CreateToken(SetUpToken(userId)); var refreshToken = RefreshTokenHelper.Generate(userId); await _authenticationRepository.CreateToken(refreshToken); var authenticationTokens = new AuthenticationTokens { AccessToken = tokenHandler.WriteToken(accessToken), RefreshToken = refreshToken.Token }; return(authenticationTokens); }
private void HashNewUserPassword(ref User user, string username) { if (!string.IsNullOrEmpty(username)) { var currentUser = _repository.GetUserByUsername(username); user.IDEntryUser = currentUser.IDEntryUser; user.EntryUser = currentUser.Account; } user.EntryDate = DateTime.Now; user.IsActive = true; user.RefreshToken = RefreshTokenHelper.GenerateRefreshToken(); user.Password = string.IsNullOrWhiteSpace(user.Password) ? user.Password : ""; var hashHelper = new HashHelper(user.Password); user.Password = hashHelper.Hash; user.SaltedPassword = hashHelper.Salt; user.LatestPasswordChangeDate = DateTime.Now; }
private async System.Threading.Tasks.Task LoadDataAsync(bool isDownload = true) { if (isDownload) { using (IProgressDialog fooIProgressDialog = UserDialogs.Instance.Loading($"請稍後,更新資料中...", null, null, true, MaskType.Black)) { bool fooRefreshTokenResult = await RefreshTokenHelper.CheckAndRefreshToken(dialogService, refreshTokenManager, systemStatusManager, appStatus); if (fooRefreshTokenResult == false) { return; } var fooResult = await leaveFormsManager.GetAsync(); } } //await leaveFormsManager.ReadFromFileAsync(); LeaveFormItemsSource.Clear(); foreach (var item in leaveFormsManager.Items) { LeaveFormModel leaveFormModel = new LeaveFormModel() { Id = item.Id, user = new UserDTO() { Id = item.user.Id }, BeginTime = item.BeginTime, EndTime = item.EndTime, TotalHours = item.TotalHours, leaveFormType = new LeaveFormTypeModel() { Id = item.leaveFormType.Id }, Description = item.Description, }; var fooItem = leaveFormTypesManager.Items.FirstOrDefault(x => x.Id == item.leaveFormType.Id); leaveFormModel.leaveFormType.Name = fooItem.Name; LeaveFormItemsSource.Add(leaveFormModel); } }
public SuggestionPageViewModel(INavigationService navigationService, IPageDialogService dialogService, RefreshTokenManager refreshTokenManager, SystemStatusManager systemStatusManager, AppStatus appStatus, SuggestionsManager suggestionsManager) { this.navigationService = navigationService; this.dialogService = dialogService; this.refreshTokenManager = refreshTokenManager; this.systemStatusManager = systemStatusManager; this.appStatus = appStatus; this.suggestionsManager = suggestionsManager; OKCommand = new DelegateCommand(async() => { using (IProgressDialog fooIProgressDialog = UserDialogs.Instance.Loading($"請稍後,更新資料中...", null, null, true, MaskType.Black)) { bool fooRefreshTokenResult = await RefreshTokenHelper.CheckAndRefreshToken(dialogService, refreshTokenManager, systemStatusManager, appStatus); if (fooRefreshTokenResult == false) { return; } var fooResult = await suggestionsManager.PostAsync(new SuggestionRequestDTO() { Subject = SuggestionModel.Subject, Message = SuggestionModel.Message, SubmitTime = DateTime.Now, User = new UserDTO() { Id = appStatus.SystemStatus.UserID }, }); if (fooResult.Status == true) { await dialogService.DisplayAlertAsync("通知", "已經成功提交", "確定"); } else { await dialogService.DisplayAlertAsync("錯誤", $"已經發生例外異常:{fooResult.Message}", "確定"); } } }); }
public TravelExpenseDetailRecordPageViewModel(INavigationService navigationService, IPageDialogService dialogService, TravelExpenseDetailService travelExpenseDetailService, RefreshTokenService refreshTokenService, SystemStatusService systemStatusService, AppStatus appStatus) { this.navigationService = navigationService; this.dialogService = dialogService; this.travelExpenseDetailService = travelExpenseDetailService; this.refreshTokenService = refreshTokenService; this.systemStatusService = systemStatusService; this.appStatus = appStatus; #region 新增 儲存 按鈕命令 SaveCommand = new DelegateCommand(async() => { #region 進行資料完整性檢查 var checkResult = SelectedItem.Validation(); if (!string.IsNullOrEmpty(checkResult)) { await dialogService.DisplayAlertAsync("錯誤", $"請檢查並且修正錯誤{Environment.NewLine}{Environment.NewLine}" + $"{checkResult}", "確定"); return; } #endregion #region 進行記錄儲存 APIResult apiResult = new APIResult(); using (IProgressDialog fooIProgressDialog = UserDialogs.Instance.Loading($"請稍後,儲存資料中...", null, null, true, MaskType.Black)) { await AppStatusHelper.ReadAndUpdateAppStatus(systemStatusService, appStatus); #region 檢查 Access Token 是否還可以使用 bool refreshTokenResult = await RefreshTokenHelper .CheckAndRefreshToken(dialogService, refreshTokenService, systemStatusService, appStatus); if (refreshTokenResult == false) { return; } #endregion if (CrudAction == MagicStringHelper.CrudAddAction) { #region 新增 差旅費用明細紀錄 fooIProgressDialog.Title = "請稍後,新增 差旅費用明細紀錄"; SelectedItem.Id = 0; apiResult = await travelExpenseDetailService.PostAsync(SelectedItem); if (apiResult.Status == true) { ToastHelper.ShowToast($"差旅費用明細紀錄 已經新增"); NavigationParameters paras = new NavigationParameters(); paras.Add(MagicStringHelper.CrudActionName, MagicStringHelper.CrudRefreshAction); await navigationService.GoBackAsync(paras); } else { await dialogService.DisplayAlertAsync("錯誤", $"差旅費用明細紀錄 儲存失敗:{apiResult.Message}", "確定"); } #endregion } else { #region 儲存 差旅費用明細紀錄 fooIProgressDialog.Title = "請稍後,儲存 差旅費用明細紀錄"; apiResult = await travelExpenseDetailService.PutAsync(SelectedItem); if (apiResult.Status == true) { ToastHelper.ShowToast($"差旅費用明細紀錄 已經儲存"); NavigationParameters paras = new NavigationParameters(); paras.Add(MagicStringHelper.CrudActionName, MagicStringHelper.CrudRefreshAction); await navigationService.GoBackAsync(paras); } else { await dialogService.DisplayAlertAsync("錯誤", $"差旅費用明細紀錄 儲存失敗:{apiResult.Message}", "確定"); } #endregion } #region 取得 差旅費用明細紀錄 fooIProgressDialog.Title = "請稍後,取得 差旅費用明細紀錄"; apiResult = await travelExpenseDetailService.GetAsync(MasterItem.Id); if (apiResult.Status == true) { await travelExpenseDetailService.WriteToFileAsync(); } else { await dialogService.DisplayAlertAsync("錯誤", $"取得 差旅費用明細紀錄 失敗:{apiResult.Message}", "確定"); } #endregion } #endregion }); #endregion #region 刪除 按鈕命令 DeleteCommand = new DelegateCommand(async() => { #region 進行記錄刪除 var confirm = await dialogService.DisplayAlertAsync( "警告", "是否要刪除這筆紀錄?", "確定", "取消"); if (confirm == false) { return; } APIResult apiResult = new APIResult(); using (IProgressDialog fooIProgressDialog = UserDialogs.Instance.Loading($"請稍後,刪除資料中...", null, null, true, MaskType.Black)) { await AppStatusHelper.ReadAndUpdateAppStatus(systemStatusService, appStatus); #region 檢查 Access Token 是否還可以使用 bool refreshTokenResult = await RefreshTokenHelper .CheckAndRefreshToken(dialogService, refreshTokenService, systemStatusService, appStatus); if (refreshTokenResult == false) { return; } #endregion #region 刪除 差旅費用明細紀錄 fooIProgressDialog.Title = "請稍後,刪除 差旅費用明細紀錄"; apiResult = await travelExpenseDetailService.DeleteAsync(SelectedItem); if (apiResult.Status == true) { ToastHelper.ShowToast($"差旅費用明細紀錄 已經刪除"); NavigationParameters paras = new NavigationParameters(); paras.Add(MagicStringHelper.CrudActionName, MagicStringHelper.CrudRefreshAction); await navigationService.GoBackAsync(paras); } else { await dialogService.DisplayAlertAsync("錯誤", $"差旅費用明細紀錄 刪除失敗:{apiResult.Message}", "確定"); } #endregion #region 取得 差旅費用明細紀錄 fooIProgressDialog.Title = "請稍後,取得 差旅費用明細紀錄"; apiResult = await travelExpenseDetailService.GetAsync(MasterItem.Id); if (apiResult.Status == true) { await travelExpenseDetailService.WriteToFileAsync(); } else { await dialogService.DisplayAlertAsync("錯誤", $"取得 差旅費用明細紀錄 失敗:{apiResult.Message}", "確定"); } #endregion } #endregion }); #endregion }
public TravelExpensePageViewModel(INavigationService navigationService, IPageDialogService dialogService, TravelExpenseService travelExpenseService, MyUserService myUserService, TravelExpenseDetailService travelExpenseDetailService, RefreshTokenService refreshTokenService, SystemStatusService systemStatusService, AppStatus appStatus) { this.navigationService = navigationService; this.dialogService = dialogService; this.travelExpenseService = travelExpenseService; this.myUserService = myUserService; this.travelExpenseDetailService = travelExpenseDetailService; this.refreshTokenService = refreshTokenService; this.systemStatusService = systemStatusService; this.appStatus = appStatus; #region 新增紀錄 AddCommand = new DelegateCommand(async() => { NavigationParameters paras = new NavigationParameters(); var fooObject = new TravelExpenseDto(); fooObject.ApplyDate = DateTime.Now.Date; #region 設定該使用者為預設紀錄申請者 var myUser = myUserService.Items .FirstOrDefault(x => x.Id == appStatus.SystemStatus.UserID); if (myUser != null) { fooObject.MyUserId = myUser.Id; fooObject.MyUserName = myUser.Name; } #endregion paras.Add(MagicStringHelper.CurrentSelectdItemParameterName, fooObject); paras.Add(MagicStringHelper.CrudActionName, MagicStringHelper.CrudAddAction); await navigationService.NavigateAsync("TravelExpenseRecordPage", paras); }); #endregion #region 點選某筆紀錄觸發命令 ItemTappedCommand = new DelegateCommand(async() => { NavigationParameters paras = new NavigationParameters(); var fooObject = SelectedItem.Clone(); paras.Add(MagicStringHelper.CurrentSelectdItemParameterName, fooObject); paras.Add(MagicStringHelper.CrudActionName, MagicStringHelper.CrudEditAction); await navigationService.NavigateAsync("TravelExpenseRecordPage", paras); }); #endregion #region 更新遠端紀錄命令 RefreshCommand = new DelegateCommand(async() => { IsRefresh = true; await ReloadData(); IsRefresh = false; }); #endregion #region 顯示明細頁面 ShowDetailCommand = new DelegateCommand <TravelExpenseDto>(async x => { #region 讀取該筆明細清單 using (IProgressDialog fooIProgressDialog = UserDialogs.Instance.Loading($"請稍後,更新資料中...", null, null, true, MaskType.Black)) { await AppStatusHelper.ReadAndUpdateAppStatus(systemStatusService, appStatus); #region 檢查 Access Token 是否還可以使用 bool refreshTokenResult = await RefreshTokenHelper .CheckAndRefreshToken(dialogService, refreshTokenService, systemStatusService, appStatus); if (refreshTokenResult == false) { return; } #endregion #region 取得 差旅費用明細紀錄 fooIProgressDialog.Title = "請稍後,取得 差旅費用明細紀錄"; var apiResultssss = await travelExpenseDetailService.GetAsync(x.Id); if (apiResultssss.Status == true) { await travelExpenseDetailService.WriteToFileAsync(); NavigationParameters paras = new NavigationParameters(); paras.Add(MagicStringHelper.MasterRecordActionName, x); await navigationService.NavigateAsync("TravelExpenseDetailPage", paras); } else { await DialogHelper.ShowAPIResultIsFailureMessage(dialogService, apiResultssss); return; } #endregion } #endregion }); #endregion }
public LeaveFormDetailPageViewModel(INavigationService navigationService, IPageDialogService dialogService, RefreshTokenManager refreshTokenManager, SystemStatusManager systemStatusManager, AppStatus appStatus, LeaveFormsManager leaveFormsManager, LeaveFormTypesManager leaveFormTypesManager) { this.navigationService = navigationService; this.dialogService = dialogService; this.leaveFormsManager = leaveFormsManager; this.leaveFormTypesManager = leaveFormTypesManager; SaveCommand = new DelegateCommand(async() => { if (IsAddMode == true) { using (IProgressDialog fooIProgressDialog = UserDialogs.Instance.Loading($"請稍後,更新資料中...", null, null, true, MaskType.Black)) { bool fooRefreshTokenResult = await RefreshTokenHelper.CheckAndRefreshToken(dialogService, refreshTokenManager, systemStatusManager, appStatus); if (fooRefreshTokenResult == false) { return; } var fooResult = await leaveFormsManager.PostAsync(new LeaveFormRequestDTO() { id = 0, BeginTime = LeaveFormItemModel.BeginDate + LeaveFormItemModel.BeginTime, EndTime = LeaveFormItemModel.EndDate + LeaveFormItemModel.EndTime, Description = LeaveFormItemModel.Description, TotalHours = LeaveFormItemModel.TotalHours, leaveFormType = new LeaveFormTypeDTO() { Id = LeaveFormTypeSelectedItem.Id } }); } } else { using (IProgressDialog fooIProgressDialog = UserDialogs.Instance.Loading($"請稍後,更新資料中...", null, null, true, MaskType.Black)) { bool fooRefreshTokenResult = await RefreshTokenHelper.CheckAndRefreshToken(dialogService, refreshTokenManager, systemStatusManager, appStatus); if (fooRefreshTokenResult == false) { return; } var fooResult = await leaveFormsManager.PutAsync(LeaveFormSelectedItem.Id, new LeaveFormRequestDTO() { id = LeaveFormSelectedItem.Id, BeginTime = LeaveFormItemModel.BeginDate + LeaveFormItemModel.BeginTime, EndTime = LeaveFormItemModel.EndDate + LeaveFormItemModel.EndTime, Description = LeaveFormItemModel.Description, TotalHours = LeaveFormItemModel.TotalHours, leaveFormType = new LeaveFormTypeDTO() { Id = LeaveFormTypeSelectedItem.Id } }); } } var queryString = "NeedRefresh=true"; var navigationParams = new NavigationParameters(queryString); await navigationService.GoBackAsync(navigationParams); }); DeleteCommand = new DelegateCommand(async() => { using (IProgressDialog fooIProgressDialog = UserDialogs.Instance.Loading($"請稍後,更新資料中...", null, null, true, MaskType.Black)) { bool fooRefreshTokenResult = await RefreshTokenHelper.CheckAndRefreshToken(dialogService, refreshTokenManager, systemStatusManager, appStatus); if (fooRefreshTokenResult == false) { return; } var fooResult = await leaveFormsManager.DeleteAsync(LeaveFormSelectedItem.Id); } var queryString = "NeedRefresh=true"; var navigationParams = new NavigationParameters(queryString); await navigationService.GoBackAsync(navigationParams); }); }
public AuthenticationController(TokenHelper tokenHelper, RefreshTokenHelper refreshTokenHelper) { _tokenHelper = tokenHelper; _refreshTokenHelper = refreshTokenHelper; }
public HomePageViewModel(INavigationService navigationService, IPageDialogService dialogService, OnlyAdministratorService OnlyAdministratorService, OnlyUserService OnlyUserService, RefreshTokenService refreshTokenService, SystemStatusService systemStatusService, AppStatus appStatus) { this.navigationService = navigationService; this.dialogService = dialogService; onlyAdministratorService = OnlyAdministratorService; onlyUserService = OnlyUserService; this.refreshTokenService = refreshTokenService; this.systemStatusService = systemStatusService; this.appStatus = appStatus; #region OnlyAdministratorCommand OnlyAdministratorCommand = new DelegateCommand(async() => { using (IProgressDialog fooIProgressDialog = UserDialogs.Instance.Loading($"請稍後,執行中...", null, null, true, MaskType.Black)) { bool fooRefreshTokenResult = await RefreshTokenHelper .CheckAndRefreshToken(dialogService, refreshTokenService, systemStatusService, appStatus); if (fooRefreshTokenResult == false) { return; } var fooResult = await OnlyAdministratorService.GetAsync(); if (fooResult.Status == false) { Message = fooResult.Message; } else { Message = fooResult.Payload.ToString(); } } }); #endregion #region OnlyUserCommand OnlyUserCommand = new DelegateCommand(async() => { using (IProgressDialog fooIProgressDialog = UserDialogs.Instance.Loading($"請稍後,執行中...", null, null, true, MaskType.Black)) { bool fooRefreshTokenResult = await RefreshTokenHelper .CheckAndRefreshToken(dialogService, refreshTokenService, systemStatusService, appStatus); if (fooRefreshTokenResult == false) { return; } var fooResult = await OnlyUserService.GetAsync(); if (fooResult.Status == false) { Message = fooResult.Message; } else { Message = fooResult.Payload.ToString(); } } }); #endregion #region 故意拋出例外 ThrowExceptionrCommand = new DelegateCommand(async() => { throw new Exception("魔鬼藏在細節中"); }); #endregion }