public void ShouldNavigateToLoginPage_IfTokenCanNotBeRenewed()
        {
            // Arrange
            _runtimeContextMock
            .Setup(x => x.AccessToken)
            .Returns(() => "access");
            _runtimeContextMock
            .Setup(x => x.RefreshToken)
            .Returns(() => "refresh");
            _authenticationServiceMock
            .Setup(x => x.RenewSession(It.IsAny <string>()))
            .Returns(() => Observable.Return(false));

            // Act
            _target = new AutoLoginViewModel(_schedulerService, _viewStackService.Object, _authenticationServiceMock.Object, _runtimeContextMock.Object);

            _target.Activator.Activate();

            // Assert
            _authenticationServiceMock.Verify(x => x.IsTokenExpired(
                                                  It.IsAny <string>()),
                                              Times.Exactly(1));
            _schedulerService.AdvanceBy(TimeSpan.FromSeconds(3));
            _authenticationServiceMock.Verify(x => x.RenewSession(
                                                  It.IsAny <string>()),
                                              Times.Exactly(1));
            _viewStackService.Verify(x => x.PushPage(
                                         It.IsAny <LoginViewModel>(),
                                         It.IsAny <string>(),
                                         It.IsAny <bool>(),
                                         It.IsAny <bool>()),
                                     Times.Exactly(1));
        }
        public void ShouldPushTo_LoginViewModel_IfRuntimeContextDoesNotHaveAccessAndRefreshToken()
        {
            // Arrange
            _runtimeContextMock
            .Setup(x => x.AccessToken)
            .Returns(() => null);
            _runtimeContextMock
            .Setup(x => x.RefreshToken)
            .Returns(() => null);

            // Act
            _target = new AutoLoginViewModel(_schedulerService, _viewStackService.Object, _authenticationServiceMock.Object, _runtimeContextMock.Object);

            _target.Activator.Activate();

            // Assert
            _viewStackService.Verify(x => x.PushPage(
                                         It.IsAny <LoginViewModel>(),
                                         It.IsAny <string>(),
                                         It.IsAny <bool>(),
                                         It.IsAny <bool>()),
                                     Times.Exactly(1));
        }
 public AutoLoginView()
 {
     InitializeComponent();
     NavigationPage.SetHasNavigationBar(this, false);
     _autoLoginViewModel = new AutoLoginViewModel(AppBootstrapper.NavigationService, AppBootstrapper.AuthenticationService);
 }
        public async Task <IActionResult> Post([FromBody] AutoLoginViewModel credentials)
        {
            //reset jwt options
            //_jwtOptions = null;
            //_jwtOptions = new JwtIssuerOptions();

            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            var identity = await GetClaimsIdentity(credentials.UserName);

            if (identity == null)
            {
                return(BadRequest(Errors.AddErrorToModelState("login_failure", "Invalid username.", ModelState)));
            }

            string          userId = identity.Claims.Single(c => c.Type == "id").Value;
            ApplicationUser user   = _ctx.Users.Include(t => t.UserProfile).FirstOrDefault(t => t.Id == userId);

            //check if user has refresh token
            var validRefreshToken = _ctx.RefreshTokens.FirstOrDefault(r => r.UserId == userId && r.IsEnabled && r.EndDate > DateTime.UtcNow &&
                                                                      r.RefreshTokenId.ToString() == credentials.RefreshTokenId);

            if (validRefreshToken != null)
            {
                if (validRefreshToken.EndDate.AddMinutes(-30) < DateTime.UtcNow)
                {
                    //create new refresh token
                    RefreshToken rt = new RefreshToken();

                    rt.StartDate = DateTime.UtcNow;

                    DateTime dtmRefreshTokenEndDate = DateTime.UtcNow;
                    dtmRefreshTokenEndDate = dtmRefreshTokenEndDate.AddMonths(6);
                    rt.EndDate             = dtmRefreshTokenEndDate;

                    rt.IsEnabled = true;
                    rt.UserId    = identity.Claims.Single(c => c.Type == "id").Value;

                    bool refreshTokenAdded = false;

                    refreshTokenAdded = await _sqlServerUow.RefreshTokens.AddAsync(rt);

                    // Serialize and return the response
                    var response = new
                    {
                        id                      = userId,
                        auth_token              = await _jwtFactory.GenerateEncodedToken(credentials.UserName, identity),
                        auth_token_valid        = (int)_jwtOptions.ValidFor.TotalSeconds,
                        auth_token_created      = _jwtOptions.IssuedAt,
                        auth_token_expires      = _jwtOptions.Expiration,
                        refresh_token           = rt.RefreshTokenId,
                        two_factor_auth_enabled = user.TwoFactorEnabled,
                        phone_number            = user.PhoneNumber,
                        email                   = user.Email,
                        first_name              = user.UserProfile.FirstName,
                        surname                 = user.UserProfile.Surname
                    };

                    var json = JsonConvert.SerializeObject(response, _serializerSettings);
                    return(new OkObjectResult(json));
                }
                else
                {
                    // Serialize and return the response
                    var response = new
                    {
                        id                      = userId,
                        auth_token              = await _jwtFactory.GenerateEncodedToken(credentials.UserName, identity),
                        auth_token_valid        = (int)_jwtOptions.ValidFor.TotalSeconds,
                        auth_token_created      = _jwtOptions.IssuedAt,
                        auth_token_expires      = _jwtOptions.Expiration,
                        refresh_token           = validRefreshToken.RefreshTokenId,
                        two_factor_auth_enabled = user.TwoFactorEnabled,
                        phone_number            = user.PhoneNumber,
                        email                   = user.Email,
                        first_name              = user.UserProfile.FirstName,
                        surname                 = user.UserProfile.Surname
                    };

                    var json = JsonConvert.SerializeObject(response, _serializerSettings);
                    return(new OkObjectResult(json));
                }
            }
            else
            {
                //create refresh token
                RefreshToken rt = new RefreshToken();

                rt.StartDate = DateTime.UtcNow;

                DateTime dtmRefreshTokenEndDate = DateTime.UtcNow;
                dtmRefreshTokenEndDate = dtmRefreshTokenEndDate.AddMonths(6);
                rt.EndDate             = dtmRefreshTokenEndDate;

                rt.IsEnabled = true;
                rt.UserId    = identity.Claims.Single(c => c.Type == "id").Value;

                bool refreshTokenAdded = false;

                refreshTokenAdded = await _sqlServerUow.RefreshTokens.AddAsync(rt);

                // Serialize and return the response
                var response = new
                {
                    id                      = userId,
                    auth_token              = await _jwtFactory.GenerateEncodedToken(credentials.UserName, identity),
                    auth_token_valid        = (int)_jwtOptions.ValidFor.TotalSeconds,
                    auth_token_created      = _jwtOptions.IssuedAt,
                    auth_token_expires      = _jwtOptions.Expiration,
                    refresh_token           = rt.RefreshTokenId,
                    two_factor_auth_enabled = user.TwoFactorEnabled,
                    phone_number            = user.PhoneNumber,
                    email                   = user.Email,
                    first_name              = user.UserProfile.FirstName,
                    surname                 = user.UserProfile.Surname
                };

                var json = JsonConvert.SerializeObject(response, _serializerSettings);
                return(new OkObjectResult(json));
            }
        }