public async Task ReplacedPrincipalIsRespected()
        {
            using HttpClient client = CreateClient(out _, 10, validatedPrincipal: context =>
            {
                context.ReplacePrincipal(
                    new ClaimsPrincipal(
                        new ClaimsIdentity(
                            new[]
                {
                    new Claim(ClaimTypes.Name, "REPLACED-NAME")
                },
                            "REPLACED-TYPE"
                            )
                        )
                    );
                return(Task.CompletedTask);
            });

            string token = PersonalAccessTokenUtilities.EncodeToken(UserId, GetPasswordBytesForToken(42, 10));

            using var request                  = new HttpRequestMessage(HttpMethod.Get, "https://example.test/pat/user-name");
            request.Headers.Authorization      = new AuthenticationHeaderValue("Bearer", token);
            using HttpResponseMessage response = await client.SendAsync(request);

            Assert.Equal(HttpStatusCode.OK, response.StatusCode);
            Assert.Equal("REPLACED-NAME", await response.Content.ReadAsStringAsync());
        }
        public async Task WrongAuthSchemeFailes()
        {
            using HttpClient client = CreateClient(out _, 10);

            string token = PersonalAccessTokenUtilities.EncodeToken(UserId, GetPasswordBytesForToken(42, 10));

            using var request                  = new HttpRequestMessage(HttpMethod.Get, "https://example.test/pat/user-name");
            request.Headers.Authorization      = new AuthenticationHeaderValue("NotBearer", token);
            using HttpResponseMessage response = await client.SendAsync(request);

            Assert.Equal(HttpStatusCode.Unauthorized, response.StatusCode);
        }
        public async Task GoodTokenWorks()
        {
            using HttpClient client = CreateClient(out _, 10);

            string token = PersonalAccessTokenUtilities.EncodeToken(UserId, GetPasswordBytesForToken(42, 10));

            using var request                  = new HttpRequestMessage(HttpMethod.Get, "https://example.test/pat/user-name");
            request.Headers.Authorization      = new AuthenticationHeaderValue("Bearer", token);
            using HttpResponseMessage response = await client.SendAsync(request);

            Assert.Equal(HttpStatusCode.OK, response.StatusCode);
            Assert.Equal(GetUser(UserId).Name, await response.Content.ReadAsStringAsync());
        }
        public async Task BadTokenRequiringAuthIsRejected()
        {
            using HttpClient client = CreateClient(out _, 10);

            var zeroTokenBytes = new byte[PersonalAccessTokenUtilities.CalculateTokenSizeForPasswordSize(10)];

            using var request             = new HttpRequestMessage(HttpMethod.Get, "https://example.test/test-auth/role/role");
            request.Headers.Authorization =
                new AuthenticationHeaderValue("Bearer", Convert.ToBase64String(zeroTokenBytes));
            using HttpResponseMessage response = await client.SendAsync(request);

            Assert.Equal(HttpStatusCode.Unauthorized, response.StatusCode);
        }
        public async Task PasswordFromWrongSizeFails()
        {
            using HttpClient client = CreateClient(out TestAppFactory factory);

            var    pat   = factory.Services.GetRequiredService <PersonalAccessTokenAuthenticationHandler <TestUser> >();
            string token = PersonalAccessTokenUtilities.EncodeToken(42, GetPasswordBytesForToken(42, 10));

            using var request                  = new HttpRequestMessage(HttpMethod.Get, "https://example.test/pat/user-name");
            request.Headers.Authorization      = new AuthenticationHeaderValue("Bearer", token);
            using HttpResponseMessage response = await client.SendAsync(request);

            Assert.Equal(HttpStatusCode.Unauthorized, response.StatusCode);
        }
        public async Task ExceptionFails()
        {
            using HttpClient client = CreateClient(out _, 10, validatedPrincipal: context =>
            {
                throw new Exception("Test Exception");
            });

            string token = PersonalAccessTokenUtilities.EncodeToken(UserId, GetPasswordBytesForToken(42, 10));

            using var request                  = new HttpRequestMessage(HttpMethod.Get, "https://example.test/pat/user-name");
            request.Headers.Authorization      = new AuthenticationHeaderValue("Bearer", token);
            using HttpResponseMessage response = await client.SendAsync(request);

            Assert.Equal(HttpStatusCode.Unauthorized, response.StatusCode);
        }
        public async Task FailedPrincipalValidateFails()
        {
            using HttpClient client = CreateClient(out _, 10, validatedPrincipal: context =>
            {
                context.RejectPrincipal();
                return(Task.CompletedTask);
            });

            string token = PersonalAccessTokenUtilities.EncodeToken(UserId, GetPasswordBytesForToken(42, 10));

            using var request                  = new HttpRequestMessage(HttpMethod.Get, "https://example.test/pat/user-name");
            request.Headers.Authorization      = new AuthenticationHeaderValue("Bearer", token);
            using HttpResponseMessage response = await client.SendAsync(request);

            response.StatusCode.Should().Be(HttpStatusCode.Unauthorized);
        }
 private static string GetPasswordForToken(int tokenId, int passwordSize)
 {
     return(PersonalAccessTokenUtilities.EncodePasswordBytes(GetPasswordBytesForToken(tokenId, passwordSize)));
 }