public async Task SigninFailureReturnsNullAndLogsTheIssue()
        {
            // arrange
            var          loggerMock   = LoggerFixture.SetupLogCatcher();
            const string tokenName    = "Test Token";
            var          refreshToken = Guid.NewGuid().ToString();
            var          fixture      = new TokenManagerFixture();
            await fixture.SetupServerDataAsync(tokenName, true);

            var token = fixture.TokenGenerator.GenerateToken();

            fixture.WellKnownSetup();
            fixture.SetupCertificates();
            fixture.AuthSetup(token, refreshToken);
            var sut = fixture.Instance;

            // act
            var result = await sut.CheckSigninAsync(tokenName);

            // assert
            result.Should().BeNull();
            loggerMock.Verify(t => t.Error("Error occured during user authentication. {Error}", It.IsAny <string>()),
                              Times.Once);

            fixture.HttpMock.HttpMock.Dispose();
        }
Example #2
0
        public async Task IfTokenExpiresWithinTheRefreshIntervalItIsRefreshed()
        {
            // arrange
            const string tokenName    = "Test Token";
            var          refreshToken = Guid.NewGuid().ToString();
            var          fixture      = new TokenManagerFixture();
            await fixture.SetupServerDataAsync(tokenName, true);

            var token           = fixture.TokenGenerator.GenerateToken(30);
            var tokenDataDummy  = new TokenData(token);
            var newAccessToken  = fixture.TokenGenerator.GenerateToken(75);
            var newRefreshToken = Guid.NewGuid().ToString();

            fixture.TokenStorageMock
            .Setup(t => t.RetrieveAccessTokenAsync(tokenName))
            .ReturnsAsync(tokenDataDummy);
            fixture.TokenStorageMock
            .Setup(t => t.RetrieveRefreshTokenAsync(tokenName))
            .ReturnsAsync(refreshToken);

            fixture.WellKnownSetup();
            fixture.SetupCertificates();
            fixture.AuthRefreshSetup(newAccessToken, newRefreshToken);
            var sut = fixture.Instance;

            // act
            await sut.CheckSigninAsync(tokenName);

            // assert
            fixture.TokenStorageMock.Verify(t => t.StoreRefreshTokenAsync(tokenName, newRefreshToken), Times.Once);
            fixture.HttpMock.Dispose();
        }
        public async Task IfTokenExpiredRefreshTokenIsRetrievedAndUsedToRefreshTheAccessToken()
        {
            // arrange
            const string tokenName    = "Test Token";
            var          refreshToken = Guid.NewGuid().ToString();
            var          fixture      = new TokenManagerFixture();
            await fixture.SetupServerDataAsync(tokenName);

            var token = fixture.TokenGenerator.GenerateToken(DateTime.UtcNow.AddMinutes(-15),
                                                             DateTime.UtcNow.AddMinutes(-10), DateTime.UtcNow.AddMinutes(-17));
            var tokenDataDummy  = new TokenData(token);
            var newAccessToken  = fixture.TokenGenerator.GenerateToken();
            var newRefreshToken = Guid.NewGuid().ToString();

            fixture.TokenStorageMock
            .Setup(t => t.RetrieveAccessTokenAsync(tokenName))
            .ReturnsAsync(tokenDataDummy);
            fixture.TokenStorageMock
            .Setup(t => t.RetrieveRefreshTokenAsync(tokenName))
            .ReturnsAsync(refreshToken);

            fixture.WellKnownSetup();
            fixture.SetupCertificates();
            fixture.AuthRefreshSetup(newAccessToken, newRefreshToken);
            var sut = fixture.Instance;

            // act
            var result = await sut.CheckSigninAsync(tokenName);

            // assert
            result.Token.Should().Be(newAccessToken);
            fixture.TokenStorageMock.Verify(t => t.StoreAccessTokenAsync(tokenName, newAccessToken), Times.Once);
            fixture.TokenStorageMock.Verify(t => t.StoreRefreshTokenAsync(tokenName, newRefreshToken), Times.Never);
            fixture.HttpMock.Dispose();
        }
        public async Task IfThereAreNoTokensSigninIsExecutedToAcquireTokens()
        {
            // arrange
            const string tokenName    = "Test Token";
            var          refreshToken = Guid.NewGuid().ToString();
            var          fixture      = new TokenManagerFixture();
            await fixture.SetupServerDataAsync(tokenName, true);

            var token = fixture.TokenGenerator.GenerateToken();

            fixture.WellKnownSetup();
            fixture.SetupCertificates();
            fixture.AuthSetup(token, refreshToken);
            fixture.UserInfoSetup();
            var sut = fixture.Instance;

            // act
            var result = await sut.CheckSigninAsync(tokenName);

            // assert
            result.Token.Should().Be(token);
            fixture.TokenStorageMock.Verify(t => t.StoreAccessTokenAsync(tokenName, token), Times.Once);
            fixture.TokenStorageMock.Verify(t => t.StoreRefreshTokenAsync(tokenName, refreshToken), Times.Once);

            fixture.HttpMock.Dispose();
        }
        public void AttemptingToSignInWhenCredentialsAreNotSetThrowsAnException()
        {
            // arrange
            const string tokenName = "Test Token";
            var          fixture   = new TokenManagerFixture();
            var          sut       = fixture.Instance;
            var          act       = new Action(() => sut.CheckSigninAsync(tokenName).Wait());

            // act
            // assert
            act.ShouldThrow <ArgumentException>();
        }
Example #6
0
        public void SettingRefreshTimeSpanUpdatesTheRefreshTimeSpan()
        {
            // arrange
            var refreshTimeSpan = TimeSpan.FromHours(3);
            var fixture         = new TokenManagerFixture();
            var sut             = fixture.Instance;

            // act
            sut.SetupRefreshTimeSpan(refreshTimeSpan);

            // assert
            sut.RefreshTimeSpan.Should().Be(refreshTimeSpan);
        }
        public async Task ServerDetailsAreAddedCorrectly()
        {
            // arrange
            const string tokenName     = "Test Token";
            var          oidcOptions   = new OidcClientOptions();
            var          serverDetails = new IdentityServerConnectionDetails(false, oidcOptions);
            var          fixture       = new TokenManagerFixture();

            var sut = fixture.Instance;

            // act
            await sut.AddServerDetails(tokenName, serverDetails);

            // assert
            sut.ServerDetailKeys.Should().Contain(tokenName);
        }
Example #8
0
        public async Task IfRefreshIntervalIsMadeLongerThanTokensRemainingTimeTheTokenIsRefreshed()
        {
            // arrange
            var          refreshTimeout = TimeSpan.FromSeconds(100);
            const string tokenName      = "Test Token";
            var          refreshToken   = Guid.NewGuid().ToString();
            var          fixture        = new TokenManagerFixture();
            await fixture.SetupServerDataAsync(tokenName, true);

            var token = fixture.TokenGenerator.GenerateToken(DateTime.UtcNow.AddMinutes(-15),
                                                             DateTime.UtcNow.AddSeconds(150), DateTime.UtcNow.AddMinutes(-17));
            var       tokenDataDummy  = new TokenData(token);
            var       newAccessToken  = fixture.TokenGenerator.GenerateToken(75);
            var       newRefreshToken = Guid.NewGuid().ToString();
            var       raisingToken    = string.Empty;
            TokenData refreshedToken  = null;

            fixture.TokenStorageMock
            .Setup(t => t.RetrieveAccessTokenAsync(tokenName))
            .ReturnsAsync(tokenDataDummy);
            fixture.TokenStorageMock
            .Setup(t => t.RetrieveRefreshTokenAsync(tokenName))
            .ReturnsAsync(refreshToken);

            fixture.WellKnownSetup();
            fixture.SetupCertificates();
            fixture.AuthRefreshSetup(newAccessToken, newRefreshToken);
            var sut = fixture.Instance;

            sut.SetupRefreshTimeSpan(refreshTimeout);
            sut.TokenRefreshed += (sender, pair) =>
            {
                raisingToken   = pair.Key;
                refreshedToken = pair.Value;
            };

            // act
            await sut.CheckSigninAsync(tokenName);

            sut.SetupRefreshTimeSpan(TimeSpan.FromSeconds(200));
            await Task.Delay(TimeSpan.FromSeconds(10));

            // assert
            raisingToken.Should().Be(tokenName);
            refreshedToken.Token.Should().Be(newAccessToken);
            fixture.HttpMock.Dispose();
        }
Example #9
0
        public async Task FailureToGetATokenWithTimerRefreshDoesNotBroadcastARefreshEvent()
        {
            // arrange
            var          loggerDummy    = LoggerFixture.SetupLogCatcher();
            var          refreshTimeout = TimeSpan.FromSeconds(10);
            const string tokenName      = "Test Token";
            var          refreshToken   = Guid.NewGuid().ToString();
            var          fixture        = new TokenManagerFixture();
            await fixture.SetupServerDataAsync(tokenName, true);

            var token = fixture.TokenGenerator.GenerateToken(DateTime.UtcNow.AddMinutes(-15),
                                                             DateTime.UtcNow.AddSeconds(15), DateTime.UtcNow.AddMinutes(-17));
            var tokenDataDummy = new TokenData(token);
            var wasRefreshed   = false;

            fixture.TokenStorageMock
            .Setup(t => t.RetrieveAccessTokenAsync(tokenName))
            .ReturnsAsync(tokenDataDummy);
            fixture.TokenStorageMock
            .Setup(t => t.RetrieveRefreshTokenAsync(tokenName))
            .ReturnsAsync(refreshToken);

            fixture.WellKnownSetup();
            fixture.SetupCertificates();
            fixture.AuthRefreshSetup(null, null);
            var sut = fixture.Instance;

            sut.SetupRefreshTimeSpan(refreshTimeout);
            sut.TokenRefreshed += (sender, pair) => { wasRefreshed = true; };

            // act
            await sut.CheckSigninAsync(tokenName);

            await Task.Delay(TimeSpan.FromSeconds(10));

            // assert
            wasRefreshed.Should().BeFalse();
            loggerDummy.Verify(
                t => t.Warning(
                    "Attempting to refresh access token failed. No further auto-refreshes will occur for {TokenName}",
                    tokenName), Times.Once);

            fixture.HttpMock.Dispose();
        }
        public async Task AddingDifferentServerDetailsForTheSameTokenNameUpdatesTheValues()
        {
            // arrange
            const string tokenName = "Test Token";

            var oidcOptions    = new OidcClientOptions();
            var serverDetails  = new IdentityServerConnectionDetails(false, oidcOptions);
            var serverDetails2 = new IdentityServerConnectionDetails(false, oidcOptions);
            var fixture        = new TokenManagerFixture();

            var sut = fixture.Instance;
            await sut.AddServerDetails(tokenName, serverDetails);

            // act
            await sut.AddServerDetails(tokenName, serverDetails2);

            // assert
            sut.ServerDetailKeys.Count.Should().Be(1);
        }
        public async Task FailureDuringRefreshTokenRetrievalWillResultInFullTokenRetrieval()
        {
            // arrange
            var          loggerMock   = LoggerFixture.SetupLogCatcher();
            const string tokenName    = "Test Token";
            var          refreshToken = Guid.NewGuid().ToString();
            var          fixture      = new TokenManagerFixture();
            await fixture.SetupServerDataAsync(tokenName);

            var token = fixture.TokenGenerator.GenerateToken(DateTime.UtcNow.AddMinutes(-15),
                                                             DateTime.UtcNow.AddMinutes(-10), DateTime.UtcNow.AddMinutes(-17));
            var tokenDataDummy = new TokenData(token);
            var newAccessToken = fixture.TokenGenerator.GenerateToken();

            fixture.TokenStorageMock
            .Setup(t => t.RetrieveAccessTokenAsync(tokenName))
            .ReturnsAsync(tokenDataDummy);
            fixture.TokenStorageMock
            .Setup(t => t.RetrieveRefreshTokenAsync(tokenName))
            .ReturnsAsync(refreshToken);

            fixture.WellKnownSetup();
            fixture.SetupCertificates();
            fixture.AuthRefreshSetup(newAccessToken, refreshToken, true);
            fixture.AuthSetup(newAccessToken, refreshToken);
            fixture.UserInfoSetup();
            var sut = fixture.Instance;

            // act
            await sut.CheckSigninAsync(tokenName);

            // assert
            loggerMock.Verify(t =>
                              t.Error("Error occured while trying to refresh Access Token. {Error}", It.IsAny <string>()));
            //result.Should().NotBeNull();
            loggerMock.Verify(t => t.Error("Error occured during user authentication. {Error}", It.IsAny <string>()),
                              Times.Once);

            fixture.HttpMock.HttpMock.Dispose();
        }
        public async Task IfAccecssTokenExistsAndHasNotExpiredYetItWillBeReturned()
        {
            // arrange
            const string tokenName = "Test Token";
            var          fixture   = new TokenManagerFixture();
            await fixture.SetupServerDataAsync(tokenName);

            var token          = fixture.TokenGenerator.GenerateToken();
            var tokenDataDummy = new TokenData(token);

            fixture.TokenStorageMock
            .Setup(t => t.RetrieveAccessTokenAsync(tokenName))
            .ReturnsAsync(tokenDataDummy);

            var sut = fixture.Instance;

            // act
            var result = await sut.CheckSigninAsync(tokenName);

            // assert
            result.Should().Be(tokenDataDummy);
        }
Example #13
0
        public async Task IfTokenExpiresAfterRefreshIntervalItIsAutomaticallyRefreshed()
        {
            // arrange
            var          refreshTimeout = TimeSpan.FromSeconds(10);
            const string tokenName      = "Test Token";
            var          refreshToken   = Guid.NewGuid().ToString();
            var          fixture        = new TokenManagerFixture();
            await fixture.SetupServerDataAsync(tokenName, true);

            var token = fixture.TokenGenerator.GenerateToken(DateTime.UtcNow.AddMinutes(-15),
                                                             DateTime.UtcNow.AddSeconds(15), DateTime.UtcNow.AddMinutes(-17));
            var tokenDataDummy  = new TokenData(token);
            var newAccessToken  = fixture.TokenGenerator.GenerateToken(75);
            var newRefreshToken = Guid.NewGuid().ToString();

            fixture.TokenStorageMock
            .Setup(t => t.RetrieveAccessTokenAsync(tokenName))
            .ReturnsAsync(tokenDataDummy);
            fixture.TokenStorageMock
            .Setup(t => t.RetrieveRefreshTokenAsync(tokenName))
            .ReturnsAsync(refreshToken);

            fixture.WellKnownSetup();
            fixture.SetupCertificates();
            fixture.AuthRefreshSetup(newAccessToken, newRefreshToken);
            var sut = fixture.Instance;

            sut.SetupRefreshTimeSpan(refreshTimeout);

            // act
            await sut.CheckSigninAsync(tokenName);

            await Task.Delay(TimeSpan.FromSeconds(10));

            // assert
            fixture.TokenStorageMock.Verify(t => t.StoreRefreshTokenAsync(tokenName, newRefreshToken), Times.Once);
            fixture.HttpMock.Dispose();
        }
        public async Task IfTheSameTokenIsRetrievedAgainAndItIsStillValidItWillNotBeRetrievedFromStorageAgain()
        {
            // arrange
            const string tokenName = "Test Token";
            var          fixture   = new TokenManagerFixture();
            await fixture.SetupServerDataAsync(tokenName);

            var token          = fixture.TokenGenerator.GenerateToken();
            var tokenDataDummy = new TokenData(token);

            fixture.TokenStorageMock
            .Setup(t => t.RetrieveAccessTokenAsync(tokenName))
            .ReturnsAsync(tokenDataDummy);

            var sut = fixture.Instance;
            await sut.CheckSigninAsync(tokenName);

            // act
            await sut.CheckSigninAsync(tokenName);

            // assert
            fixture.TokenStorageMock.Verify(t => t.RetrieveAccessTokenAsync(tokenName), Times.Once);
        }