Пример #1
0
        public AuthenticationResult Authenticate()
        {
            this.tokens = this.tokenRepository.GetTokens();
            if (this.tokens == null)
            {
                throw new NoTokensException("Application not authorised. ", this.GetAuthorizationUrl());
            }

            if (this.IsExpired(this.tokens))
            {
                this.logger.LogDebug("oauth tokens expired, refreshing");
                try
                {
                    this.tokens = this.RefreshTokens();
                    this.tokenRepository.SaveTokens(this.tokens);
                }
                catch (Exception ex)
                {
                    return(new AuthenticationResult {
                        Exception = ex
                    });
                }
            }

            return(new AuthenticationResult
            {
                AccessToken = this.tokens.AccessToken,
                Success = true
            });
        }
Пример #2
0
        public void GetTokenRefreshResponse_GetsTokens()
        {
            HttpWebResponse response = Substitute.For <HttpWebResponse>();

            response.GetResponseStream().Returns(new MemoryStream(GetTestRefreshBody()));

            OAuthAccessTokens result = AuthorizationResponseReader.ReadTokenRefreshResponse(response);

            Assert.NotNull(result);
        }
Пример #3
0
        public void IsExpired_ReturnsCorrectly(
            int acquiredAgo, int expiresIn, int earlyExpiry, bool expectedResult)
        {
            OAuthAccessTokens tokens = new OAuthAccessTokens
            {
                Acquired = DateTime.UtcNow.Subtract(TimeSpan.FromSeconds(acquiredAgo)),
                ExpiresIn = expiresIn
            };

            Assert.Equal(expectedResult, TokenValidityChecker.IsExpired(tokens, earlyExpiry));
        }
Пример #4
0
        public void GetTokens_FileDoesntExist_ReturnsNull()
        {
            IFileSystem fileSystem = Substitute.For <IFileSystem>();

            fileSystem.OpenRead(Arg.Any <string>()).Returns((x) => { throw new FileNotFoundException(); });

            this.sut = new JsonFileTokenRepository(fileSystem);

            OAuthAccessTokens result = this.sut.GetTokens();

            Assert.Null(result);
        }
Пример #5
0
        public void GetTokens_FileExists_GetsTokens()
        {
            IFileSystem fileSystem = Substitute.For <IFileSystem>();

            fileSystem.OpenRead(Arg.Any <string>()).Returns(this.GetTestTokenStream());

            this.sut = new JsonFileTokenRepository(fileSystem);

            OAuthAccessTokens result = this.sut.GetTokens();

            Assert.NotNull(result);
        }
Пример #6
0
        public void GetTokens_Succeeds()
        {
            File.Copy($"../../../testdata/{TokenFilename}", TokenFilename, true);

            this.sut = new JsonFileTokenRepository(new FileSystem());

            OAuthAccessTokens result = this.sut.GetTokens();

            Assert.NotNull(result);

            File.Delete(TokenFilename);
        }
Пример #7
0
        public static OAuthAccessTokens ReadTokenRefreshResponse(HttpWebResponse response)
        {
            StreamReader streamReader = new StreamReader(response.GetResponseStream());

            OAuthAccessTokens tokens = null;

            using (JsonTextReader textReader = new JsonTextReader(streamReader))
            {
                JsonSerializer serializer = new JsonSerializer();
                tokens          = serializer.Deserialize <OAuthAccessTokens>(textReader);
                tokens.Acquired = DateTime.UtcNow;
            }

            return(tokens);
        }
Пример #8
0
        public void SaveTokens_SavesTokens()
        {
            IFileSystem fileSystem = Substitute.For <IFileSystem>();

            fileSystem.OpenWrite(Arg.Any <string>()).Returns(new MemoryStream());
            OAuthAccessTokens accessTokens = new OAuthAccessTokens
            {
                AccessToken  = "foo",
                RefreshToken = "bar",
                TokenType    = "bundy"
            };

            this.sut = new JsonFileTokenRepository(fileSystem);

            this.sut.SaveTokens(accessTokens);

            fileSystem.ReceivedWithAnyArgs().OpenWrite(default(string));
        }
Пример #9
0
        public void SaveTokens_Succeeds()
        {
            OAuthAccessTokens accessTokens = new OAuthAccessTokens
            {
                AccessToken  = "foo",
                RefreshToken = "bar",
                TokenType    = "bundy"
            };

            File.Delete(TokenFilename);

            this.sut = new JsonFileTokenRepository(new FileSystem());

            this.sut.SaveTokens(accessTokens);

            Assert.True(File.Exists(TokenFilename));

            File.Delete(TokenFilename);
        }
Пример #10
0
        public OAuthAccessTokens GetTokens()
        {
            OAuthAccessTokens tokens = null;

            try
            {
                string fullTokenFilename =
                    Path.Combine(Environment.ExpandEnvironmentVariables("%HOMEDRIVE%%HOMEPATH%"), TokenFilename);
                StreamReader streamReader = new StreamReader(this.fileSystem.OpenRead(fullTokenFilename));

                using (JsonTextReader textReader = new JsonTextReader(streamReader))
                {
                    JsonSerializer serializer = new JsonSerializer();
                    tokens = serializer.Deserialize <OAuthAccessTokens>(textReader);
                }
            }
            catch (FileNotFoundException) { }

            return(tokens);
        }
Пример #11
0
        private Stream GetTestTokenStream()
        {
            OAuthAccessTokens tokens = new OAuthAccessTokens
            {
                AccessToken  = "foo",
                RefreshToken = "bar",
                TokenType    = "bundy"
            };

            MemoryStream stream       = new MemoryStream();
            StreamWriter streamWriter = new StreamWriter(stream);

            JsonTextWriter textWriter = new JsonTextWriter(streamWriter);
            JsonSerializer serializer = new JsonSerializer();

            serializer.Serialize(textWriter, tokens);
            textWriter.Flush();
            stream.Position = 0;

            return(stream);
        }
Пример #12
0
        public void SaveTokens(OAuthAccessTokens accessTokens)
        {
            if (accessTokens == null)
            {
                throw new ArgumentNullException(nameof(accessTokens));
            }

            string fullTokenFilename =
                Path.Combine(Environment.ExpandEnvironmentVariables("%HOMEDRIVE%%HOMEPATH%"), TokenFilename);

            this.fileSystem.Delete(fullTokenFilename);

            StreamWriter streamWriter = new StreamWriter(this.fileSystem.OpenWrite(fullTokenFilename));

            using (JsonTextWriter textWriter = new JsonTextWriter(streamWriter))
            {
                JsonSerializer serializer = new JsonSerializer();
                serializer.Serialize(textWriter, accessTokens);
                textWriter.Flush();
            }
        }
Пример #13
0
        public void GetOAuthAccessTokens_GetsTokens_ReturnsTokens()
        {
            IHttpClient     httpClient = Substitute.For <IHttpClient>();
            HttpWebResponse response   = Substitute.For <HttpWebResponse>();

            response.StatusCode.Returns(HttpStatusCode.OK);
            response.GetResponseStream().Returns(this.GetTokensBody());
            httpClient.Execute(Arg.Any <HttpWebRequest>()).Returns(response);

            VstsConfig vstsConfig = new VstsConfig
            {
                TokenUrl          = @"https://app.vssps.visualstudio.com/oauth2/token",
                AuthorizationUrl  = @"http://localhost:5000/api/auth",
                TokenBodyTemplate = "client_assertion_type=urn:ietf:params:oauth:client-assertion-type:jwt-bearer&client_assertion={0}&grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&assertion={1}&redirect_uri={2}"
            };

            this.sut = new VstsOAuthAuthorizationService(httpClient, vstsConfig);

            OAuthAccessTokens result = this.sut.GetOAuthAccessTokens("someCode", "someState|someSecret");

            Assert.NotNull(result);
        }
Пример #14
0
        public static bool IsExpired(OAuthAccessTokens tokens, int earlyExpiry)
        {
            if (tokens == null)
            {
                throw new ArgumentNullException(nameof(tokens));
            }
            if (earlyExpiry < 0)
            {
                throw new ArgumentException("argument cannot be less than zero", nameof(earlyExpiry));
            }

            int effectiveExpiry;

            if (earlyExpiry > tokens.ExpiresIn)
            {
                effectiveExpiry = tokens.ExpiresIn;
            }
            else
            {
                effectiveExpiry = tokens.ExpiresIn - earlyExpiry;
            }

            return(tokens.Acquired.AddSeconds(effectiveExpiry) < DateTime.UtcNow);
        }
Пример #15
0
 protected override bool IsExpired(OAuthAccessTokens tokens)
 {
     return(false);
 }
Пример #16
0
 protected virtual bool IsExpired(OAuthAccessTokens tokens)
 {
     return(TokenValidityChecker.IsExpired(tokens, this.vstsConfig.TokenEarlyExpiry));
 }