public IActionResult RefreshToken(RefreshTokenRequest req) { var result = RefreshTokenManager.RefreshToken(req.AccessToken, req.RefreshToken, _config, _userService); if (result == null) { return(Unauthorized()); } return(Ok(result)); }
public async Task GetSavedRefreshToken__Found_zero_matching_refresh_token__Should_throw_InvalidOperationException() { using (var factory = new DbContextFactory()) { using (var context = await factory.CreateContextAsync()) { var manager = new RefreshTokenManager(context, _logger, _jwtOptions); Func <Task> action = async() => await manager.GetSavedRefreshTokenAsync(_validRefreshToken.Token); await action.Should().ThrowExactlyAsync <InvalidOperationException>("Because RefreshToken not found."); } } }
public async Task AddRefreshToken__Add_successful__Resource_contains_added_RefreshToken() { using (var factory = new DbContextFactory()) { using (var context = await factory.CreateContextAsync()) { var manager = new RefreshTokenManager(context, _logger, _jwtOptions); await manager.AddRefreshTokenAsync(_validRefreshToken); context.RefreshTokens.Contains(_validRefreshToken).Should().BeTrue(); } } }
public async Task DeleteRefreshTokenAsync__Argument_refresh_token_is_null__Should_throw_ArgumentNullException() { using (var factory = new DbContextFactory()) { using (var context = await factory.CreateContextAsync()) { var manager = new RefreshTokenManager(context, _logger, _jwtOptions); Func <Task> action = async() => await manager.DeleteRefreshTokenAsync(null); await action.Should().ThrowExactlyAsync <ArgumentNullException>(); } } }
public async Task GetSavedRefreshToken__Arguemnt_refresh_token_is_null_or_empty__Should_throw_ArgumentNullException([Values(null, "")] string refreshToken) { using (var factory = new DbContextFactory()) { using (var context = await factory.CreateContextAsync()) { var manager = new RefreshTokenManager(context, _logger, _jwtOptions); Func <Task> action = async() => await manager.GetSavedRefreshTokenAsync(refreshToken); await action.Should().ThrowExactlyAsync <ArgumentException>("Because refreshToken cannot be null or empty."); } } }
public async Task AddRefreshToken__Add_successful__Resource_length_should_be_greater_by_1() { using (var factory = new DbContextFactory()) { using (var context = await factory.CreateContextAsync()) { int expectedLength = context.RefreshTokens.Count() + 1; var manager = new RefreshTokenManager(context, _logger, _jwtOptions); await manager.AddRefreshTokenAsync(_validRefreshToken); context.RefreshTokens.Count().Should().Be(expectedLength); } } }
public LogoutCleanHelper(IPageDialogService dialogService, DepartmentsManager departmentsManager, SystemEnvironmentsManager systemEnvironmentsManager, SystemStatusManager systemStatusManager, AppStatus appStatus, RefreshTokenManager refreshTokenManager, ExceptionRecordsManager exceptionRecordsManager, LeaveFormsManager leaveFormsManager, CommUserGroupsManager commUserGroupsManager) { this.dialogService = dialogService; this.departmentsManager = departmentsManager; this.systemEnvironmentsManager = systemEnvironmentsManager; this.systemStatusManager = systemStatusManager; this.appStatus = appStatus; this.refreshTokenManager = refreshTokenManager; this.exceptionRecordsManager = exceptionRecordsManager; this.leaveFormsManager = leaveFormsManager; }
public async Task AddRefreshToken__Resource_is_null__Should_throw_InternalDbServiceException() { using (var factory = new DbContextFactory()) { using (var context = await factory.CreateContextAsync()) { context.RefreshTokens = null as DbSet <RefreshToken>; var manager = new RefreshTokenManager(context, _logger, _jwtOptions); Func <Task> action = async() => await manager.AddRefreshTokenAsync(_validRefreshToken); await action.Should().ThrowExactlyAsync <InternalDbServiceException>("Because resource reference is set to null"); } } }
public LeaveFormPageViewModel(INavigationService navigationService, IPageDialogService dialogService, LeaveFormsManager leaveFormsManager, LeaveFormTypesManager leaveFormTypesManager, RefreshTokenManager refreshTokenManager, SystemStatusManager systemStatusManager, AppStatus appStatus) { this.navigationService = navigationService; this.dialogService = dialogService; this.leaveFormsManager = leaveFormsManager; this.leaveFormTypesManager = leaveFormTypesManager; this.refreshTokenManager = refreshTokenManager; this.systemStatusManager = systemStatusManager; this.appStatus = appStatus; RefreshCommand = new DelegateCommand(async() => { IsRefreshing = true; await LoadDataAsync(); IsRefreshing = false; }); AddCommand = new DelegateCommand(async() => { LeaveFormModel leaveFormModel = new LeaveFormModel() { BeginTime = DateTime.Today + new TimeSpan(09, 00, 00), EndTime = DateTime.Today + new TimeSpan(18, 00, 00), Id = 0, TotalHours = 8, user = new UserDTO() { Id = appStatus.SystemStatus.UserID }, Description = "請假原因", leaveFormType = new LeaveFormTypeModel() { Id = leaveFormTypesManager.Items[0].Id, Name = leaveFormTypesManager.Items[0].Name }, }; NavigationParameters fooPara = new NavigationParameters(); fooPara.Add("Record", leaveFormModel); await navigationService.NavigateAsync("LeaveFormDetailPage", fooPara); }); ItemTappedCommand = new DelegateCommand(async() => { var leaveFormSelectedItemClone = LeaveFormSelectedItem.Clone(); NavigationParameters fooPara = new NavigationParameters(); fooPara.Add("Record", leaveFormSelectedItemClone); await navigationService.NavigateAsync("LeaveFormDetailPage", fooPara); }); }
public async Task GenerateRefreshToken__Generate_succeeded__Should_return_refresh_token_with_data() { using (var factory = new DbContextFactory()) { using (var context = await factory.CreateContextAsync()) { var manager = new RefreshTokenManager(context, _logger, _jwtOptions); var result = manager.GenerateRefreshToken(); result.Should().NotBeNull(); result.Token.Should().NotBeEmpty(); result.Id.Should().NotBeEmpty(); } } }
public async Task CreateAsync(AuthenticationTokenCreateContext context) { if (!context.Ticket.Properties.Dictionary.ContainsKey("as:client_id")) { return; } var clientid = context.Ticket.Properties.Dictionary["as:client_id"]; if (string.IsNullOrEmpty(clientid)) { return; } var refreshTokenId = Guid.NewGuid().ToString("n"); var userManager = context.OwinContext.GetUserManager <ApplicationUserManager>(); var refreshTokenLifeTime = context.OwinContext.Get <string>("as:clientRefreshTokenLifeTime"); var clientManager = new ClientManager(); var refreshTokenManager = new RefreshTokenManager(); var token = new RefreshToken() { Id = AuthHelper.GetHash(refreshTokenId), Client = clientManager.FindClient(clientid), User = await userManager.FindByNameAsync(context.Ticket.Identity.Name), Issued = DateTime.UtcNow, Expires = DateTime.UtcNow.AddMinutes(Convert.ToDouble(refreshTokenLifeTime)) }; context.Ticket.Properties.IssuedUtc = token.Issued; context.Ticket.Properties.ExpiresUtc = token.Expires; token.ProtectedTicket = context.SerializeTicket(); var result = await refreshTokenManager.AddRefreshToken(token); //something went wrong here if (result) { context.SetToken(refreshTokenId); } }
public async Task DeleteRefreshTokenAsync__Resource_is_empty__Should_throw_InvalidOperationException() { using (var factory = new DbContextFactory()) { using (var context = await factory.CreateContextAsync()) { context.RefreshTokens.RemoveRange(await context.RefreshTokens.ToArrayAsync()); await context.SaveChangesAsync(); } using (var context = await factory.CreateContextAsync()) { var manager = new RefreshTokenManager(context, _logger, _jwtOptions); Func <Task> action = async() => await manager.DeleteRefreshTokenAsync(_validRefreshToken); await action.Should().ThrowExactlyAsync <InvalidOperationException>("Because resource is empty and cannot delete any element."); } } }
public async Task AddRefreshToken__In_resource_exists_the_same_RefreshToken_as_this_one_to_be_added__Should_throw_InvalidOperationException() { using (var factory = new DbContextFactory()) { using (var context = await factory.CreateContextAsync()) { context.RefreshTokens.Add(_validRefreshToken); await context.SaveChangesAsync(); } using (var context = await factory.CreateContextAsync()) { var manager = new RefreshTokenManager(context, _logger, _jwtOptions); Func <Task> action = async() => await manager.AddRefreshTokenAsync(_validRefreshToken); await action.Should().ThrowExactlyAsync <InvalidOperationException>("Because in resource exists the same RefreshToken as this one to be added."); } } }
public async Task DeleteRefreshTokenAsync__Delete_successful__Resources_should_not_contain_deleted_refresh_token() { using (var factory = new DbContextFactory()) { using (var context = await factory.CreateContextAsync()) { context.RefreshTokens.Add(_validRefreshToken); context.SaveChanges(); } using (var context = await factory.CreateContextAsync()) { var manager = new RefreshTokenManager(context, _logger, _jwtOptions); await manager.DeleteRefreshTokenAsync(_validRefreshToken); context.RefreshTokens.Where(x => x.Token.Equals(_validRefreshToken.Token)).Count().Should().Be(0); } } }
public async Task AddRefreshToken__Resource_does_not_exist__Should_throw_InternalDbmanagerException() { using (var factory = new DbContextFactory()) { using (var context = await factory.CreateContextAsync()) { // Drop RefreshTokens table. context.Database.ExecuteSqlCommand("DROP TABLE [RefreshTokens]"); } using (var context = await factory.CreateContextAsync()) { var manager = new RefreshTokenManager(context, _logger, _jwtOptions); Func <Task> action = async() => await manager.AddRefreshTokenAsync(_validRefreshToken); await action.Should().ThrowExactlyAsync <InternalDbServiceException>("Because resource doesnt exist and cannot get single instance of RefreshToken. " + "NOTE Excaption actually is type of 'SqLiteError' only if database provider is SQLite."); } } }
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 async Task DeleteRefreshTokenAsync__RefreshToken_to_be_deleted_not_found__Should_throw_InvalidOperationException() { using (var factory = new DbContextFactory()) { using (var context = await factory.CreateContextAsync()) { context.RefreshTokens.Add(new RefreshToken { Id = Guid.NewGuid().ToString(), Token = "sample_new_token" }); context.SaveChanges(); } using (var context = await factory.CreateContextAsync()) { var manager = new RefreshTokenManager(context, _logger, _jwtOptions); Func <Task> action = async() => await manager.DeleteRefreshTokenAsync(_validRefreshToken); await action.Should().ThrowExactlyAsync <InvalidOperationException>("Because RefreshToken to be deleted not found."); } } }
public static async Task <bool> CheckAndRefreshToken(IPageDialogService dialogService, RefreshTokenManager refreshTokenManager, SystemStatusManager systemStatusManager, AppStatus appStatus) { if (appStatus.SystemStatus.TokenExpireDatetime > DateTime.Now) { #region Token 尚在有效期限 return(true); #endregion } else { #region Token 已經失效了,需要更新 var fooResult = await refreshTokenManager.GetAsync(); if (fooResult.Status != true) { await dialogService.DisplayAlertAsync("發生錯誤", fooResult.Message, "確定"); return(false); } systemStatusManager.SingleItem = appStatus.SystemStatus; systemStatusManager.SingleItem.IsLogin = true; systemStatusManager.SingleItem.LoginedTime = DateTime.Now; systemStatusManager.SingleItem.Token = refreshTokenManager.SingleItem.Token; systemStatusManager.SingleItem.RefreshToken = refreshTokenManager.SingleItem.RefreshToken; systemStatusManager.SingleItem.TokenExpireMinutes = refreshTokenManager.SingleItem.TokenExpireMinutes; systemStatusManager.SingleItem.RefreshTokenExpireDays = refreshTokenManager.SingleItem.RefreshTokenExpireDays; systemStatusManager.SingleItem.SetExpireDatetime(); #endregion } //await systemStatusManager.WriteToFileAsync(); await AppStatusHelper.WriteAndUpdateAppStatus(systemStatusManager, appStatus); return(true); }
public async Task DeleteRefreshTokenAsync__Delete_successful__Resources_length_should_be_less_by_1() { int expectedLength; using (var factory = new DbContextFactory()) { using (var context = await factory.CreateContextAsync()) { context.RefreshTokens.Add(_validRefreshToken); context.SaveChanges(); } using (var context = await factory.CreateContextAsync()) { expectedLength = context.RefreshTokens.Count() - 1; var manager = new RefreshTokenManager(context, _logger, _jwtOptions); await manager.DeleteRefreshTokenAsync(_validRefreshToken); context.RefreshTokens.Count().Should().Be(expectedLength); } } }
public async Task ReceiveAsync(AuthenticationTokenReceiveContext context) { string hashedTokenId = AuthHelper.GetHash(context.Token); var clientManager = new ClientManager(); var refreshTokenManager = new RefreshTokenManager(); var refreshToken = await refreshTokenManager.FindRefreshToken(hashedTokenId); //if it is null then this probably means that you're trying with an old token if (refreshToken == null) { //tokens expired //context.Response.Response.errSetError("invalid_clientId", "ClientId should be sent."); } if (refreshToken != null) { //Get protectedTicket from refreshToken class context.DeserializeTicket(refreshToken.ProtectedTicket); var result = await refreshTokenManager.RemoveRefreshToken(hashedTokenId); } }
public async Task GetSavedRefreshToken__RefreshToken_found__Should_return_this_RefreshToken() { RefreshToken expectedRefreshToken; using (var factory = new DbContextFactory()) { using (var context = await factory.CreateContextAsync()) { context.RefreshTokens.Add(_validRefreshToken); await context.SaveChangesAsync(); } using (var context = await factory.CreateContextAsync()) { expectedRefreshToken = await context.RefreshTokens.FirstOrDefaultAsync(); var manager = new RefreshTokenManager(context, _logger, _jwtOptions); var result = await manager.GetSavedRefreshTokenAsync(expectedRefreshToken.Token); result.Should().BeEquivalentTo(expectedRefreshToken); } } }
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); }); }