public async Task GetRawTokenAsync_SendsCorrectRequest()
        {
            HttpConfiguration config = new HttpConfiguration();
            config.SetMobileAppSettingsProvider(new MobileAppSettingsProvider());

            string accessToken = "facebookAccessToken";
            string authToken = "zumoAuthToken";
            string facebookId = "facebookUserId";
            string providerName = "Facebook";
            TokenEntry tokenEntry = new TokenEntry(providerName);
            tokenEntry.AccessToken = accessToken;
            tokenEntry.AuthenticationToken = authToken;
            tokenEntry.UserId = facebookId;

            MockHttpMessageHandler handlerMock = new MockHttpMessageHandler(CreateResponse(tokenEntry));

            var webappUri = "http://test";
            Mock<AppServiceHttpClient> appServiceClientMock = new Mock<AppServiceHttpClient>(new Uri(webappUri));
            appServiceClientMock.CallBase = true;
            appServiceClientMock.Setup(c => c.CreateHttpClient())
                .Returns(new HttpClient(handlerMock));

            // Act
            TokenEntry result = await appServiceClientMock.Object.GetRawTokenAsync(accessToken, "Facebook");

            // Assert
            Assert.Equal(accessToken, result.AccessToken);
            Assert.Equal(authToken, result.AuthenticationToken);
            Assert.Equal(facebookId, result.UserId);
            Assert.Equal(webappUri + "/.auth/me?provider=facebook", handlerMock.ActualRequest.RequestUri.ToString());
            Assert.Equal(accessToken, handlerMock.ActualRequest.Headers.GetValues("x-zumo-auth").Single());
            Assert.Equal("MobileAppNetServerSdk", handlerMock.ActualRequest.Headers.GetValues("User-Agent").Single());
        }
        public void PopulateProviderCredentials_Facebook_CreatesExpectedCredentials()
        {
            const string UserIdClaimValue = "FacebookId";

            FacebookCredentials credentials = new FacebookCredentials();

            TokenEntry tokenEntry = new TokenEntry("facebook");
            tokenEntry.AccessToken = "TestAccessToken";
            List<ClaimSlim> claims = new List<ClaimSlim>
            {
                new ClaimSlim("Claim1", "Value1"),
                new ClaimSlim("Claim2", "Value2"),
                new ClaimSlim("Claim3", "Value3"),
            };
            tokenEntry.UserClaims = claims;
            tokenEntry.UserId = UserIdClaimValue;

            IPrincipalExtensions.PopulateProviderCredentials(tokenEntry, credentials);

            Assert.Equal("TestAccessToken", credentials.AccessToken);
            Assert.Equal(UserIdClaimValue, credentials.UserId);
            Assert.Equal(claims.Count, credentials.Claims.Count);
        }
        public void PopulateProviderCredentials_Google_CreatesExpectedCredentials()
        {
            const string UserIdClaimValue = "GoogleId";

            GoogleCredentials credentials = new GoogleCredentials();

            TokenEntry tokenEntry = new TokenEntry("google");
            tokenEntry.AccessToken = "TestAccessToken";
            tokenEntry.RefreshToken = "TestRefreshToken";
            tokenEntry.ExpiresOn = DateTime.Parse("2015-03-12T16:49:28.504Z");
            List<ClaimSlim> claims = new List<ClaimSlim>
            {
                new ClaimSlim("Claim1", "Value1"),
                new ClaimSlim("Claim2", "Value2"),
                new ClaimSlim("Claim3", "Value3"),
            };
            tokenEntry.UserClaims = claims;
            tokenEntry.UserId = UserIdClaimValue;

            IPrincipalExtensions.PopulateProviderCredentials(tokenEntry, credentials);

            Assert.Equal("TestAccessToken", credentials.AccessToken);
            Assert.Equal("TestRefreshToken", credentials.RefreshToken);
            Assert.Equal(DateTimeOffset.Parse("2015-03-12T16:49:28.504Z"), credentials.AccessTokenExpiration);
            Assert.Equal(UserIdClaimValue, credentials.UserId);
            Assert.Equal(claims.Count, credentials.Claims.Count);
        }
        public async Task GetIdentityAsync_Succeeds()
        {
            // Arrange
            TokenEntry tokenEntry = new TokenEntry("facebook");
            tokenEntry.UserId = "userId";
            tokenEntry.AccessToken = "accessToken";
            tokenEntry.UserClaims = new List<ClaimSlim>() { new ClaimSlim(ClaimTypes.NameIdentifier, "11111111") };

            HttpResponseMessage response = CreateOkResponseWithContent(tokenEntry);
            MockHttpMessageHandler handler = new MockHttpMessageHandler(response);

            ClaimsPrincipal user = new ClaimsPrincipal(CreateMockClaimsIdentity(new[] { new Claim(JwtRegisteredClaimNames.Iss, "http://contoso.com") }, true));
            HttpRequestMessage request = new HttpRequestMessage();
            request.Headers.Add(AuthHeaderName, "token");

            //Act
            FacebookCredentials creds = await user.GetAppServiceIdentityAsync<FacebookCredentials>(request, new HttpClient(handler));

            // Assert
            Assert.Equal(tokenEntry.UserId, creds.UserId);
            Assert.Equal(tokenEntry.AccessToken, creds.AccessToken);
            Assert.Equal("Facebook", creds.Provider);
            Assert.Equal(1, tokenEntry.UserClaims.Count());
            ClaimSlim claim = tokenEntry.UserClaims[0];
            Assert.Equal(ClaimTypes.NameIdentifier, claim.Type);
            Assert.Equal("11111111", claim.Value);

            Assert.Equal("http://contoso.com/.auth/me?provider=facebook", handler.ActualRequest.RequestUri.ToString());
            Assert.Equal("token", handler.ActualRequest.GetHeaderOrDefault(AuthHeaderName));
        }
        public void IsTokenValid_ReturnsTrue_WhenTokenIsValid()
        {
            // Arrange
            TokenEntry tokenEntry = new TokenEntry("facebook");
            tokenEntry.UserId = "userId";
            tokenEntry.AuthenticationToken = "zumoAuthToken";
            tokenEntry.AccessToken = "accessToken";

            // Act
            bool result = IPrincipalExtensions.IsTokenValid(tokenEntry);

            // Assert
            Assert.True(result);
        }
        public void PopulateProviderCredentials_Twitter_CreatesExpectedCredentials()
        {
            TwitterCredentials credentials = new TwitterCredentials();

            TokenEntry tokenEntry = new TokenEntry("twitter");
            tokenEntry.AccessToken = "TestAccessToken";
            tokenEntry.AccessTokenSecret = "TestAccessTokenSecret";
            List<ClaimSlim> claims = new List<ClaimSlim>
            {
                new ClaimSlim("Claim1", "Value1"),
                new ClaimSlim("Claim2", "Value2"),
                new ClaimSlim("Claim3", "Value3"),
            };
            tokenEntry.UserClaims = claims;

            IPrincipalExtensions.PopulateProviderCredentials(tokenEntry, credentials);

            Assert.Equal("TestAccessToken", credentials.AccessToken);
            Assert.Equal("TestAccessTokenSecret", credentials.AccessTokenSecret);
            Assert.Equal(claims.Count, credentials.Claims.Count);
        }
        public void PopulateProviderCredentials_AzureActiveDirectory_CreatesExpectedCredentials()
        {
            const string UserIdClaimValue = "AadId";

            AzureActiveDirectoryCredentials credentials = new AzureActiveDirectoryCredentials();

            TokenEntry tokenEntry = new TokenEntry("aad");
            tokenEntry.AccessToken = "TestAccessToken";
            tokenEntry.ExpiresOn = DateTime.Parse("2015-03-12T16:49:28.504Z");
            List<ClaimSlim> claims = new List<ClaimSlim>
            {
                new ClaimSlim("Claim1", "Value1"),
                new ClaimSlim("Claim2", "Value2"),
                new ClaimSlim("Claim3", "Value3"),
                new ClaimSlim(TenantIdClaimType, "TestTenantId"),
                new ClaimSlim(ObjectIdentifierClaimType, "TestObjectId"),
            };
            tokenEntry.UserClaims = claims;
            tokenEntry.UserId = UserIdClaimValue;

            IPrincipalExtensions.PopulateProviderCredentials(tokenEntry, credentials);

            Assert.Equal("TestAccessToken", credentials.AccessToken);
            Assert.Equal("TestTenantId", credentials.Claims.GetValueOrDefault(TenantIdClaimType));
            Assert.Equal("TestObjectId", credentials.Claims.GetValueOrDefault(ObjectIdentifierClaimType));
            Assert.Equal(UserIdClaimValue, credentials.UserId);
            Assert.Equal(claims.Count, credentials.Claims.Count);
        }
        private static HttpResponseMessage CreateResponse(TokenEntry tokenEntry)
        {
            HttpResponseMessage response = new HttpResponseMessage();
            response.Content = new StringContent(JsonConvert.SerializeObject(tokenEntry));
            response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json");

            return response;
        }
        public void PopulateProviderCredentials_AzureActiveDirectory_CreatesExpectedCredentials()
        {
            const string UserIdClaimValue = "AadId";

            AzureActiveDirectoryCredentials credentials = new AzureActiveDirectoryCredentials();

            TokenEntry tokenEntry = new TokenEntry("aad");
            tokenEntry.AccessToken = "TestAccessToken";
            tokenEntry.IdToken = "TestIdToken";
            tokenEntry.ExpiresOn = DateTime.Parse("2015-03-12T16:49:28.504Z");
            List<ClaimSlim> claims = new List<ClaimSlim>
            {
                new ClaimSlim("Claim1", "Value1"),
                new ClaimSlim("Claim2", "Value2"),
                new ClaimSlim("Claim3", "Value3"),
                new ClaimSlim(TenantIdClaimType, "TestTenantId"),
                new ClaimSlim(ObjectIdentifierClaimType, "TestObjectId"),
            };
            tokenEntry.UserClaims = claims;
            tokenEntry.UserId = UserIdClaimValue;

            IPrincipalExtensions.PopulateProviderCredentials(tokenEntry, credentials);

            // For AAD, the id_token value needs to get copied to AccessToken, not the access_token value.
            Assert.Equal("TestIdToken", credentials.AccessToken);
            Assert.Equal("TestTenantId", credentials.UserClaims.Single(c => string.Equals(c.Type, TenantIdClaimType, StringComparison.Ordinal)).Value);
            Assert.Equal("TestObjectId", credentials.UserClaims.Single(c => string.Equals(c.Type, ObjectIdentifierClaimType, StringComparison.Ordinal)).Value);
            Assert.Equal(UserIdClaimValue, credentials.UserId);
            Assert.Equal(claims.Count, credentials.UserClaims.Count());
        }