示例#1
0
        public IActionResult RefreshToken(RefreshTokenRequest req)
        {
            var result = RefreshTokenManager.RefreshToken(req.AccessToken, req.RefreshToken, _config, _userService);

            if (result == null)
            {
                return(Unauthorized());
            }
            return(Ok(result));
        }
示例#2
0
        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.");
                }
            }
        }
示例#3
0
        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();
                }
            }
        }
示例#4
0
        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>();
                }
            }
        }
示例#5
0
        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.");
                }
            }
        }
示例#6
0
        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);
                }
            }
        }
示例#7
0
 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;
 }
示例#8
0
        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);
     });
 }
示例#10
0
        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();
                }
            }
        }
示例#11
0
        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);
            }
        }
示例#12
0
        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.");
                }
            }
        }
示例#13
0
        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.");
                }
            }
        }
示例#14
0
        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);
                }
            }
        }
示例#15
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}", "確定");
             }
         }
     });
 }
示例#17
0
        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.");
                }
            }
        }
示例#18
0
        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);
        }
示例#19
0
        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);
                }
            }
        }
示例#20
0
        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);
            }
        }
示例#21
0
        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);
     });
 }