internal ServiceBundle(
            ApplicationConfiguration config,
            bool shouldClearCaches = false)
        {
            Config = config;

            DefaultLogger = new MsalLogger(
                Guid.Empty,
                config.ClientName,
                config.ClientVersion,
                config.LogLevel,
                config.EnablePiiLogging,
                config.IsDefaultPlatformLoggingEnabled,
                config.LoggingCallback);

            PlatformProxy = config.PlatformProxy ?? PlatformProxyFactory.CreatePlatformProxy(DefaultLogger);
            HttpManager   = config.HttpManager ?? new HttpManager(config.HttpClientFactory);

            if (config.TelemetryConfig != null)
            {
                // This can return null if the device isn't sampled in.  There's no need for processing MATS events if we're not going to send them.
                Mats             = TelemetryClient.CreateMats(config, PlatformProxy, config.TelemetryConfig);
                TelemetryManager = Mats?.TelemetryManager ?? new TelemetryManager(config, PlatformProxy, config.TelemetryCallback);
            }
            else
            {
                TelemetryManager = new TelemetryManager(config, PlatformProxy, config.TelemetryCallback);
            }

            InstanceDiscoveryManager           = new InstanceDiscoveryManager(HttpManager, TelemetryManager, shouldClearCaches);
            WsTrustWebRequestManager           = new WsTrustWebRequestManager(HttpManager);
            AuthorityEndpointResolutionManager = new AuthorityEndpointResolutionManager(this, shouldClearCaches);
        }
コード例 #2
0
        public override void TestInitialize()
        {
            base.TestInitialize();

            _networkMetadataProvider      = Substitute.For <INetworkMetadataProvider>();
            _knownMetadataProvider        = Substitute.For <IKnownMetadataProvider>();
            _networkCacheMetadataProvider = Substitute.For <INetworkCacheMetadataProvider>();
            _userMetadataProvider         = Substitute.For <IUserMetadataProvider>();

            _expectedResult = new InstanceDiscoveryMetadataEntry()
            {
                Aliases          = new[] { "some_env.com", "some_env2.com" },
                PreferredCache   = "env",
                PreferredNetwork = "env"
            };

            _harness = base.CreateTestHarness();

            _testRequestContext = new RequestContext(_harness.ServiceBundle, Guid.NewGuid());
            _discoveryManager   = new InstanceDiscoveryManager(
                _harness.HttpManager,
                false,
                null,
                null,
                _knownMetadataProvider,
                _networkCacheMetadataProvider,
                _networkMetadataProvider);
        }
        internal ServiceBundle(
            ApplicationConfiguration config,
            bool shouldClearCaches = false)
        {
            Config = config;

            ApplicationLogger = new MsalLogger(
                Guid.Empty,
                config.ClientName,
                config.ClientVersion,
                config.LogLevel,
                config.EnablePiiLogging,
                config.IsDefaultPlatformLoggingEnabled,
                config.LoggingCallback);

            PlatformProxy = config.PlatformProxy ?? PlatformProxyFactory.CreatePlatformProxy(ApplicationLogger);
            HttpManager   = config.HttpManager ?? new HttpManager(
                config.HttpClientFactory ??
                PlatformProxy.CreateDefaultHttpClientFactory());

            HttpTelemetryManager = new HttpTelemetryManager();
            if (config.TelemetryConfig != null)
            {
                // This can return null if the device isn't sampled in.  There's no need for processing MATS events if we're not going to send them.
                Mats = TelemetryClient.CreateMats(config, PlatformProxy, config.TelemetryConfig);
                MatsTelemetryManager = Mats?.TelemetryManager ??
                                       new TelemetryManager(config, PlatformProxy, config.TelemetryCallback);
            }
            else
            {
                MatsTelemetryManager = new TelemetryManager(config, PlatformProxy, config.TelemetryCallback);
            }

            InstanceDiscoveryManager = new InstanceDiscoveryManager(
                HttpManager,
                shouldClearCaches,
                config.CustomInstanceDiscoveryMetadata,
                config.CustomInstanceDiscoveryMetadataUri);

            WsTrustWebRequestManager = new WsTrustWebRequestManager(HttpManager);
            ThrottlingManager        = SingletonThrottlingManager.GetInstance();
            DeviceAuthManager        = config.DeviceAuthManagerForTest ?? PlatformProxy.CreateDeviceAuthManager();

            if (shouldClearCaches)
            {
                AuthorityManager.ClearValidationCache();
            }
        }
コード例 #4
0
        public async Task NetworkCacheProvider_IsUsedFirst_Async()
        {
            // Arrange
            INetworkMetadataProvider networkMetadataProvider = new NetworkMetadataProvider(
                Substitute.For <IHttpManager>(),
                Substitute.For <IMatsTelemetryManager>(),
                _networkCacheMetadataProvider);

            _networkCacheMetadataProvider.GetMetadata("some_env.com", Arg.Any <ICoreLogger>()).Returns(_expectedResult);

            _discoveryManager = new InstanceDiscoveryManager(
                _harness.HttpManager,
                _harness.ServiceBundle.MatsTelemetryManager,
                false,
                null,
                null,
                _knownMetadataProvider,
                _networkCacheMetadataProvider,
                networkMetadataProvider);

            // Act
            InstanceDiscoveryMetadataEntry actualResult1 = await _discoveryManager.GetMetadataEntryTryAvoidNetworkAsync(
                Authority,
                new[] { "env1", "env2" },
                _testRequestContext)
                                                           .ConfigureAwait(false);

            _networkCacheMetadataProvider.Received(1).GetMetadata("some_env.com", Arg.Any <ICoreLogger>());

            InstanceDiscoveryMetadataEntry actualResult2 = await _discoveryManager.GetMetadataEntryAsync(
                "https://some_env.com/tid",
                _testRequestContext)
                                                           .ConfigureAwait(false);

            _networkCacheMetadataProvider.Received(2).GetMetadata("some_env.com", Arg.Any <ICoreLogger>());
            _networkCacheMetadataProvider.AddMetadata(null, null);

            // Assert
            Assert.AreSame(_expectedResult, actualResult1, "The static provider should be queried first");
            Assert.AreSame(_expectedResult, actualResult2, "The static provider should be queried first");
        }
        public async Task NetworkProviderIsCalledLastAsync()
        {
            // Arrange
            _staticMetadataProvider = new StaticMetadataProvider();

            _discoveryManager = new InstanceDiscoveryManager(
                _harness.HttpManager,
                _harness.ServiceBundle.TelemetryManager,
                false,
                _knownMetadataProvider,
                _staticMetadataProvider,
                _networkMetadataProvider);

            var otherEnvs = new[] { "env1", "env2" };
            InstanceDiscoveryResponse discoveryResponse = new InstanceDiscoveryResponse
            {
                Metadata = new[] { _expectedResult }
            };
            var authorityUri = new Uri(Authority);

            // No response from the static and known provider
            _knownMetadataProvider
            .GetMetadata("some_env.com", otherEnvs)
            .Returns((InstanceDiscoveryMetadataEntry)null);
            _networkMetadataProvider
            .FetchAllDiscoveryMetadataAsync(authorityUri, _testRequestContext)
            .Returns(discoveryResponse);

            // Act
            InstanceDiscoveryMetadataEntry actualResult = await _discoveryManager.GetMetadataEntryTryAvoidNetworkAsync(
                "https://some_env.com/tid",
                otherEnvs,
                _testRequestContext)
                                                          .ConfigureAwait(false);

            // Assert
            Assert.AreSame(_expectedResult, actualResult, "The known metadata provider should be queried second");
            _knownMetadataProvider.Received(1).GetMetadata("some_env.com", otherEnvs);
            _ = _networkMetadataProvider.Received(1).FetchAllDiscoveryMetadataAsync(authorityUri, _testRequestContext);
        }
コード例 #6
0
        public async Task CustomDiscoveryEndpoint_Async()
        {
            // Arrange
            Uri customDiscoveryEndpoint = new Uri("http://some.discovery.endpoint");

            _discoveryManager = new InstanceDiscoveryManager(
                _harness.HttpManager,
                _harness.ServiceBundle.MatsTelemetryManager,
                false,
                null,
                customDiscoveryEndpoint,
                _knownMetadataProvider,
                _networkCacheMetadataProvider,
                _networkMetadataProvider);

            var otherEnvs    = new[] { "env1", "env2" };
            var authorityUri = new Uri(Authority);

            // No response from the static and known provider
            _knownMetadataProvider
            .GetMetadata("some_env.com", otherEnvs, Arg.Any <ICoreLogger>())
            .Returns((InstanceDiscoveryMetadataEntry)null);

            _networkMetadataProvider
            .GetMetadataAsync(authorityUri, _testRequestContext)
            .Returns(_expectedResult);

            // Act
            InstanceDiscoveryMetadataEntry actualResult = await _discoveryManager.GetMetadataEntryTryAvoidNetworkAsync(
                "https://some_env.com/tid",
                otherEnvs,
                _testRequestContext)
                                                          .ConfigureAwait(false);

            // Assert
            Assert.AreSame(_expectedResult, actualResult, "The known metadata provider should be queried second");
            _knownMetadataProvider.Received(1).GetMetadata("some_env.com", otherEnvs, Arg.Any <ICoreLogger>());
            await _networkMetadataProvider.Received(1).GetMetadataAsync(authorityUri, _testRequestContext).ConfigureAwait(false);
        }
コード例 #7
0
        internal ServiceBundle(
            ApplicationConfiguration config,
            bool shouldClearCaches = false)
        {
            Config = config;

            ApplicationLogger = new MsalLogger(
                Guid.Empty,
                config.ClientName,
                config.ClientVersion,
                config.LogLevel,
                config.EnablePiiLogging,
                config.IsDefaultPlatformLoggingEnabled,
                config.LoggingCallback);

            PlatformProxy = config.PlatformProxy ?? PlatformProxyFactory.CreatePlatformProxy(ApplicationLogger);
            HttpManager   = config.HttpManager ?? new HttpManager(
                config.HttpClientFactory ??
                PlatformProxy.CreateDefaultHttpClientFactory());

            HttpTelemetryManager = new HttpTelemetryManager();

            InstanceDiscoveryManager = new InstanceDiscoveryManager(
                HttpManager,
                shouldClearCaches,
                config.CustomInstanceDiscoveryMetadata,
                config.CustomInstanceDiscoveryMetadataUri);

            WsTrustWebRequestManager = new WsTrustWebRequestManager(HttpManager);
            ThrottlingManager        = SingletonThrottlingManager.GetInstance();
            DeviceAuthManager        = config.DeviceAuthManagerForTest ?? PlatformProxy.CreateDeviceAuthManager();

            if (shouldClearCaches) // for test
            {
                AuthorityManager.ClearValidationCache();
                PoPProviderFactory.Reset();
            }
        }
コード例 #8
0
        public async Task UserProvider_TakesPrecedence_OverNetworkProvider_Async()
        {
            // Arrange
            _discoveryManager = new InstanceDiscoveryManager(
                _harness.HttpManager,
                _harness.ServiceBundle.TelemetryManager,
                false,
                _userMetadataProvider,
                _knownMetadataProvider,
                _networkCacheMetadataProvider,
                _networkMetadataProvider);

            var otherEnvs = new[] { "env1", "env2" };

            _userMetadataProvider.GetMetadataOrThrow("some_env.com", Arg.Any <ICoreLogger>()).Returns(_expectedResult);

            // Act
            InstanceDiscoveryMetadataEntry actualResult = await _discoveryManager.GetMetadataEntryTryAvoidNetworkAsync(
                "https://some_env.com/tid",
                otherEnvs,
                _testRequestContext)
                                                          .ConfigureAwait(false);

            InstanceDiscoveryMetadataEntry actualResult2 = await _discoveryManager.GetMetadataEntryAsync(
                "https://some_env.com/tid",
                _testRequestContext)
                                                           .ConfigureAwait(false);

            // Assert
            Assert.AreSame(_expectedResult, actualResult, "The user metadata provider should be queried second");
            Assert.AreSame(_expectedResult, actualResult2, "The user metadata provider should be queried second");
            _userMetadataProvider.Received(2).GetMetadataOrThrow("some_env.com", Arg.Any <ICoreLogger>());
            _knownMetadataProvider.DidNotReceiveWithAnyArgs().GetMetadata(null, null, null);
            await _networkMetadataProvider.DidNotReceiveWithAnyArgs().GetMetadataAsync(
                Arg.Any <Uri>(),
                Arg.Any <RequestContext>()).ConfigureAwait(false);
        }
コード例 #9
0
        public async Task UserProvider_TakesPrecedence_OverNetworkProvider_Async()
        {
            // Arrange
            _discoveryManager = new InstanceDiscoveryManager(
                _harness.HttpManager,
                false,
                _userMetadataProvider,
                null,
                _knownMetadataProvider,
                _networkCacheMetadataProvider,
                _networkMetadataProvider);

            var otherEnvs    = new[] { "env1", "env2" };
            var authorityUri = new Uri(Authority);

            // No response from the static and known provider
            _knownMetadataProvider
            .GetMetadata("some_env.com", otherEnvs, Arg.Any <ICoreLogger>())
            .Returns((InstanceDiscoveryMetadataEntry)null);

            _networkMetadataProvider
            .GetMetadataAsync(authorityUri, _testRequestContext)
            .Returns(_expectedResult);

            // Act
            InstanceDiscoveryMetadataEntry actualResult = await _discoveryManager.GetMetadataEntryTryAvoidNetworkAsync(
                AuthorityInfo.FromAuthorityUri("https://some_env.com/tid", true),
                otherEnvs,
                _testRequestContext)
                                                          .ConfigureAwait(false);

            // Assert
            Assert.AreSame(_expectedResult, actualResult, "The known metadata provider should be queried second");
            _knownMetadataProvider.Received(1).GetMetadata("some_env.com", otherEnvs, Arg.Any <ICoreLogger>());
            await _networkMetadataProvider.Received(1).GetMetadataAsync(authorityUri, _testRequestContext).ConfigureAwait(false);
        }