예제 #1
0
        private async Task <(HttpRequestMessage HttpRequest, Guid Correlationid)> RunAcquireTokenForClientAsync(
            AcquireTokenForClientOutcome outcome, bool forceRefresh = false)
        {
            MockHttpMessageHandler tokenRequestHandler = null;
            Guid correlationId = default;

            switch (outcome)
            {
            case AcquireTokenForClientOutcome.Success:

                tokenRequestHandler = _harness.HttpManager.AddSuccessTokenResponseMockHandlerForPost(authority: TestConstants.AuthorityRegional);
                var authResult = await _app
                                 .AcquireTokenForClient(TestConstants.s_scope)
                                 .WithAzureRegion(true)
                                 .WithForceRefresh(forceRefresh)
                                 .ExecuteAsync()
                                 .ConfigureAwait(false);

                correlationId = authResult.CorrelationId;
                break;

            case AcquireTokenForClientOutcome.AADUnavailableError:
                correlationId = Guid.NewGuid();

                tokenRequestHandler = new MockHttpMessageHandler()
                {
                    ExpectedMethod  = HttpMethod.Post,
                    ResponseMessage = MockHelpers.CreateFailureMessage(
                        System.Net.HttpStatusCode.GatewayTimeout, "gateway timeout")
                };
                var tokenRequestHandler2 = new MockHttpMessageHandler()
                {
                    ExpectedMethod  = HttpMethod.Post,
                    ResponseMessage = MockHelpers.CreateFailureMessage(
                        System.Net.HttpStatusCode.GatewayTimeout, "gateway timeout")
                };

                // 2 of these are needed because MSAL has a "retry once" policy for 5xx errors
                _harness.HttpManager.AddMockHandler(tokenRequestHandler2);
                _harness.HttpManager.AddMockHandler(tokenRequestHandler);

                var serviceEx = await AssertException.TaskThrowsAsync <MsalServiceException>(() =>
                                                                                             _app
                                                                                             .AcquireTokenForClient(TestConstants.s_scope)
                                                                                             .WithAzureRegion(true)
                                                                                             .WithForceRefresh(true)
                                                                                             .WithCorrelationId(correlationId)
                                                                                             .ExecuteAsync())
                                .ConfigureAwait(false);

                break;

            default:
                throw new NotImplementedException();
            }

            Assert.AreEqual(0, _harness.HttpManager.QueueSize);

            return(tokenRequestHandler?.ActualRequestMessage, correlationId);
        }
예제 #2
0
        private async Task <(HttpRequestMessage HttpRequest, Guid Correlationid)> RunAcquireTokenForClientAsync(
            AcquireTokenForClientOutcome outcome, bool forceRefresh = false, bool serializeCache = false)
        {
            MockHttpMessageHandler tokenRequestHandler = null;
            Guid correlationId = default;

            switch (outcome)
            {
            case AcquireTokenForClientOutcome.Success:

                var app = ConfidentialClientApplicationBuilder.Create(TestConstants.ClientId)
                          .WithAuthority(AzureCloudInstance.AzurePublic, TestConstants.TenantId, false)
                          .WithClientSecret(TestConstants.ClientSecret)
                          .WithHttpManager(_harness.HttpManager)
                          .WithAzureRegion()
                          .WithExperimentalFeatures(true)
                          .BuildConcrete();

                if (serializeCache)
                {
                    InMemoryTokenCache mem = new InMemoryTokenCache();
                    mem.Bind(app.AppTokenCache);
                }

                tokenRequestHandler = _harness.HttpManager.AddSuccessTokenResponseMockHandlerForPost(authority: TestConstants.AuthorityRegional);
                var authResult = await app
                                 .AcquireTokenForClient(TestConstants.s_scope)
                                 .WithForceRefresh(forceRefresh)
                                 .ExecuteAsync()
                                 .ConfigureAwait(false);

                correlationId = authResult.CorrelationId;
                break;

            case AcquireTokenForClientOutcome.FallbackToGlobal:
                _harness.HttpManager.AddInstanceDiscoveryMockHandler();
                tokenRequestHandler = _harness.HttpManager.AddSuccessTokenResponseMockHandlerForPost(authority: TestConstants.AuthorityTenant);

                var app2 = ConfidentialClientApplicationBuilder.Create(TestConstants.ClientId)
                           .WithAuthority(AzureCloudInstance.AzurePublic, TestConstants.TenantId, false)
                           .WithClientSecret(TestConstants.ClientSecret)
                           .WithHttpManager(_harness.HttpManager)
                           .WithAzureRegion()
                           .WithExperimentalFeatures(true)
                           .BuildConcrete();

                authResult = await app2
                             .AcquireTokenForClient(TestConstants.s_scope)
                             .WithForceRefresh(forceRefresh)
                             .ExecuteAsync()
                             .ConfigureAwait(false);

                correlationId = authResult.CorrelationId;
                break;

            case AcquireTokenForClientOutcome.UserProvidedRegion:

                tokenRequestHandler = _harness.HttpManager.AddSuccessTokenResponseMockHandlerForPost(authority: TestConstants.AuthorityRegional);


                var app3 = ConfidentialClientApplicationBuilder.Create(TestConstants.ClientId)
                           .WithAuthority(AzureCloudInstance.AzurePublic, TestConstants.TenantId, false)
                           .WithClientSecret(TestConstants.ClientSecret)
                           .WithHttpManager(_harness.HttpManager)
                           .WithAzureRegion(TestConstants.Region)
                           .WithExperimentalFeatures(true)
                           .BuildConcrete();
                authResult = await app3
                             .AcquireTokenForClient(TestConstants.s_scope)
                             .WithForceRefresh(forceRefresh)
                             .ExecuteAsync()
                             .ConfigureAwait(false);

                correlationId = authResult.CorrelationId;
                break;

            case AcquireTokenForClientOutcome.AADUnavailableError:
                correlationId = Guid.NewGuid();

                var app5 = ConfidentialClientApplicationBuilder.Create(TestConstants.ClientId)
                           .WithAuthority(AzureCloudInstance.AzurePublic, TestConstants.TenantId, false)
                           .WithClientSecret(TestConstants.ClientSecret)
                           .WithHttpManager(_harness.HttpManager)
                           .WithAzureRegion()
                           .WithExperimentalFeatures(true)
                           .BuildConcrete();

                tokenRequestHandler = new MockHttpMessageHandler()
                {
                    ExpectedMethod  = HttpMethod.Post,
                    ResponseMessage = MockHelpers.CreateFailureMessage(
                        System.Net.HttpStatusCode.GatewayTimeout, "gateway timeout")
                };
                var tokenRequestHandler2 = new MockHttpMessageHandler()
                {
                    ExpectedMethod  = HttpMethod.Post,
                    ResponseMessage = MockHelpers.CreateFailureMessage(
                        System.Net.HttpStatusCode.GatewayTimeout, "gateway timeout")
                };

                // 2 of these are needed because MSAL has a "retry once" policy for 5xx errors
                _harness.HttpManager.AddMockHandler(tokenRequestHandler2);
                _harness.HttpManager.AddMockHandler(tokenRequestHandler);

                var serviceEx = await AssertException.TaskThrowsAsync <MsalServiceException>(() =>
                                                                                             app5
                                                                                             .AcquireTokenForClient(TestConstants.s_scope)
                                                                                             .WithForceRefresh(true)
                                                                                             .WithCorrelationId(correlationId)
                                                                                             .ExecuteAsync())
                                .ConfigureAwait(false);

                break;

            default:
                throw new NotImplementedException();
            }

            Assert.AreEqual(0, _harness.HttpManager.QueueSize);

            return(tokenRequestHandler?.ActualRequestMessage, correlationId);
        }