public void Test_KeyVault_MsiConfigValidate()
        {
            // Arrange
            var msiConfigGood = new MsiConfig {
                KeyVaultInstanceName = "test"
            };
            var msiConfigBad    = new MsiConfig();
            var msiConfigString = msiConfigGood.ToString();

            // Act/Assert
            AssertExtensions.DoesNotThrow(() => msiConfigGood.Validate());
            var validationResult = msiConfigGood.Validate();

            validationResult.IsValid.Should().BeTrue();
            validationResult.Errors.Count().Should().Be(0);

            validationResult = msiConfigBad.Validate();
            validationResult.IsValid.Should().BeFalse();
            validationResult.Errors.Count().Should().Be(1);

            msiConfigBad.KeyVaultInstanceName = "test";
            validationResult = msiConfigBad.Validate();
            validationResult.IsValid.Should().BeTrue();
            validationResult.Errors.Count().Should().Be(0);
        }
        public void Test_Configuration_MsiValidation()
        {
            // Arrange
            var msiConfig = new MsiConfig();

            // Act/Assert - Check the msi config validation.
            var validationRes = msiConfig.Validate();

            validationRes.IsValid.Should().BeFalse();
            validationRes.Errors.ToList().Count.Should().Be(4);

            msiConfig.InstanceName = "test";
            validationRes          = msiConfig.Validate();
            validationRes.IsValid.Should().BeFalse();
            validationRes.Errors.ToList().Count.Should().Be(3);

            msiConfig.TenantId = "test";
            validationRes      = msiConfig.Validate();
            validationRes.IsValid.Should().BeFalse();
            validationRes.Errors.ToList().Count.Should().Be(2);

            msiConfig.DatabaseName = "test";
            validationRes          = msiConfig.Validate();
            validationRes.IsValid.Should().BeFalse();
            validationRes.Errors.ToList().Count.Should().Be(1);

            msiConfig.SubscriptionId = "test";
            validationRes            = msiConfig.Validate();
            validationRes.IsValid.Should().BeTrue();
            validationRes.Errors.ToList().Count.Should().Be(0);
            msiConfig.ToString().Length.Should().BeGreaterThan(0);
        }
Beispiel #3
0
        /// <summary>
        /// Initializes a new instance of ServiceBusMessenger with Managed Service Identity (MSI) authentication.
        /// </summary>
        /// <param name="config">The Msi ServiceBus configuration.</param>
        /// <param name="logger">The logger.</param>
        public ServiceBusMessenger([NotNull] MsiConfig config, ILogger logger = null)
        {
            // Ensure all required configuration is as expected.
            config.Validate();
            Name = config.InstanceName;

            Logger     = logger;
            _msiConfig = config;
            Config     = config;
        }
        /// <summary>Initializes a new instance of the KeyVault class using Managed Service Principle (MSI) security.</summary>
        /// <param name="config">Msi configuration for this instance.</param>
        public KeyVault([NotNull] MsiConfig config)
        {
            // Ensure the required config values are all set.
            config.ThrowIfInvalid();

            MsiConfig   = config;
            InstanceUri = config.Uri;
            Name        = config.KeyVaultInstanceName;
            Config      = config;
        }
Beispiel #5
0
        /// <summary>
        /// Initializes a new instance of the <see cref="TableStorageBase"/> class.
        /// </summary>
        /// <param name="config">The configuration.</param>
        /// <param name="logger">The logger.</param>
        protected TableStorageBase(MsiConfig config, ILogger logger = null)
        {
            // Ensure all mandatory fields are set.
            config.ThrowIfInvalid();

            Logger    = logger;
            MsiConfig = config;
            Name      = config.InstanceName;

            _instanceName   = config.InstanceName;
            _subscriptionId = config.SubscriptionId;
        }
Beispiel #6
0
        public void Test_MsiConfig_ConfigValidation()
        {
            // Arrange
            var msiConfig = new MsiConfig();

            // Act/Assert - Check the msi config validation.
            Assert.Throws <ValidateException>(() => msiConfig.ThrowIfInvalid());
            msiConfig.InstanceName = "test";
            Assert.Throws <ValidateException>(() => msiConfig.ThrowIfInvalid());
            msiConfig.TenantId = "test";
            Assert.Throws <ValidateException>(() => msiConfig.ThrowIfInvalid());
            msiConfig.SubscriptionId = "test";
            AssertExtensions.DoesNotThrow(() => msiConfig.ThrowIfInvalid());
            msiConfig.ToString().Should().NotBeNullOrEmpty();
        }
        /// <summary>
        /// Initializes a new instance of the <see cref="CosmosStorageBase"/> class.
        /// </summary>
        /// <param name="config">The configuration.</param>
        /// <param name="logger">The logger.</param>
        protected CosmosStorageBase(MsiConfig config, ILogger logger = null)
        {
            // Validate the config.
            config.ThrowIfInvalid();

            Logger       = logger;
            MsiConfig    = config;
            Name         = config.InstanceName;
            DatabaseName = config.DatabaseName;

            _instanceName                = config.InstanceName;
            _subscriptionId              = config.SubscriptionId;
            _createIfNotExists           = config.CreateDatabaseIfNotExists;
            _createTableNames            = config.CreateTables;
            _maxThroughput               = config.MaxThroughput;
            _autoscaleDatabaseThroughput = config.AutoscaleDatabaseThroughput;
        }
Beispiel #8
0
        public void Test_ServiceBusMessenger_GetAccessTokenUrlNotImplemented()
        {
            // Arrange/Act
            var msiConfig = new MsiConfig()
            {
                SharedAccessPolicyName = ""
            };
            var connectionConfig = new ConnectionConfig();
            var spConfig         = new ServicePrincipleConfig()
            {
                SharedAccessPolicyName = "TestPolicy", InstanceName = "testSBInstance", AppId = "TestAppId", AppSecret = "TestAppSecret", TenantId = "TestTenantId", SubscriptionId = "FakeSubscriptionId"
            };
            var serviceBus = new ServiceBusMessenger(spConfig);

            // Assert
            serviceBus.ToString().Should().NotBeNullOrEmpty();
            serviceBus.Name.Should().Be("testSBInstance");
            (serviceBus.Config as ServicePrincipleConfig).Should().NotBeNull();
        }
Beispiel #9
0
        public void Test_MsiConfig_Validate()
        {
            // Arrange
            var msiConfig = new MsiConfig()
            {
                SharedAccessPolicyName = ""
            };

            // Act/Assert - Check the msi config validation.
            Assert.Throws <ArgumentException>(() => msiConfig.Validate());
            msiConfig.InstanceName = "test";
            Assert.Throws <ArgumentException>(() => msiConfig.Validate());
            msiConfig.TenantId = "test";
            Assert.Throws <ArgumentException>(() => msiConfig.Validate());
            msiConfig.SubscriptionId = "test";
            Assert.Throws <ArgumentException>(() => msiConfig.Validate());
            msiConfig.SharedAccessPolicyName = "test";
            AssertExtensions.DoesNotThrow(() => msiConfig.Validate());
            msiConfig.ToString().Should().NotBeNullOrEmpty();
        }
        public void Test_MsiConfig_Validate()
        {
            // Arrange
            var msiConfig = new MsiConfig()
            {
                InstanceName   = null,
                SubscriptionId = null,
                TenantId       = null,
                Receiver       = null,
                Sender         = null
            };

            // Act/Assert
            Assert.Throws <ValidateException>(() => msiConfig.ThrowIfInvalid());
            Assert.Null(msiConfig.InstanceName);
            Assert.Null(msiConfig.Receiver);
            Assert.Null(msiConfig.Sender);
            Assert.Null(msiConfig.SubscriptionId);
            Assert.Null(msiConfig.TenantId);
            msiConfig.ToString().Should().NotBeNullOrEmpty();
        }
Beispiel #11
0
 /// <summary>
 /// Adds the service bus singleton instance and NamedInstanceFactory{ServiceBusInstance} configured.
 /// Uses MsiConfig to setup configuration.
 /// </summary>
 /// <param name="services">Service collection to extend.</param>
 /// <param name="config">The configuration.</param>
 /// <returns>Modified service collection with the IReactiveMessenger or IMessenger and NamedInstanceFactory{T} configured.</returns>
 public static IServiceCollection AddServiceBusSingleton <T>(this IServiceCollection services, MsiConfig config)
     where T : IMessageOperations
 {
     return(AddNamedInstance <T>(services, null, new ServiceBusMessenger(config)));
 }
Beispiel #12
0
        /// <summary>
        /// Adds the service bus singleton.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="services">The services.</param>
        /// <param name="config">The configuration.</param>
        /// <returns>ServiceCollection.</returns>
        /// <exception cref="InvalidOperationException">Problem occurred while configuring Service Bus Manager Identify config</exception>
        public static IServiceCollection AddServiceBusSingleton <T>(this IServiceCollection services, MsiConfig config)
            where T : IMessageOperations
        {
            var serviceBusInstance = new ServiceBusMessenger(config);

            services.AddSingleton(typeof(T), serviceBusInstance);
            services.AddFactoryIfNotAdded <IMessenger>();
            services.AddFactoryIfNotAdded <IReactiveMessenger>();
            return(services);
        }
 /// <summary>
 /// Adds the key vault singleton instance using managed identity config.
 /// </summary>
 /// <param name="services">The services.</param>
 /// <param name="config">The configuration.</param>
 /// <returns>IServiceCollection.</returns>
 public static IServiceCollection AddKeyVaultSingleton(this IServiceCollection services, MsiConfig config)
 {
     services.AddSingleton <ISecureVault>(new KeyVault(config));
     AddFactoryIfNotAdded(services);
     return(services);
 }
 /// <summary>
 /// Initializes a new instance of the <see cref="BlobStorage" /> class with Managed Service Identity (MSI) authentication.
 /// </summary>
 /// <param name="config">The Managed Service Identity (MSI) configuration for connecting to storage.</param>
 /// <param name="logger">The logger.</param>
 public BlobStorage([NotNull] MsiConfig config, [MaybeNull] ILogger logger = null)
     : base(config, logger)
 {
 }
Beispiel #15
0
 /// <summary>
 /// Initializes a new instance of ServiceBusMessenger with Managed Service Identity (MSI) authentication.
 /// </summary>
 /// <param name="config">The Msi ServiceBus configuration.</param>
 /// <param name="logger">The logger.</param>
 public StorageQueueMessenger([NotNull] MsiConfig config, ILogger logger = null)
     : base(config, logger)
 {
 }
 /// <summary>
 /// Adds an instance of Azure cosmos storage as a singleton, using managed user config to setup.
 /// </summary>
 /// <param name="services">The services to extend.</param>
 /// <param name="config">The configuration to initialise with.</param>
 /// <returns>IServiceCollection.</returns>
 public static IServiceCollection AddCosmosStorageSingleton(this IServiceCollection services, MsiConfig config)
 {
     services.AddSingleton <ITableStorage>(new CosmosStorage(config));
     services.AddFactoryIfNotAdded <ITableStorage>();
     return(services);
 }
        /// <summary>
        /// Adds the state storage singleton.
        /// </summary>
        /// <param name="services">The services.</param>
        /// <param name="config">The configuration.</param>
        /// <returns>IServiceCollection.</returns>
        public static IServiceCollection AddStateStorageSingleton(this IServiceCollection services, MsiConfig config)
        {
            var instance = new Cloud.Core.Storage.AzureTableStorage.TableStorage(config)
            {
                Name = $"{config.InstanceName}-StateStorage"
            };

            services.AddSingleton <IStateStorage>(instance);
            return(services);
        }
 /// <summary>
 /// Adds an instance of Azure Table storage as a singleton, using managed user config to setup.
 /// </summary>
 /// <param name="services">The services to extend.</param>
 /// <param name="config">The configuration to initialise with.</param>
 /// <returns>IServiceCollection.</returns>
 public static IServiceCollection AddTableStorageSingleton(this IServiceCollection services, MsiConfig config)
 {
     services.AddSingleton <ITableStorage>(new Cloud.Core.Storage.AzureTableStorage.TableStorage(config));
     services.AddFactoryIfNotAdded <ITableStorage>();
     return(services);
 }
Beispiel #19
0
 /// <summary>
 /// Adds the service bus singleton instance and NamedInstanceFactory{ServiceBusInstance} configured.
 /// Uses MsiConfig to setup configuration.
 /// </summary>
 /// <param name="services">Service collection to extend.</param>
 /// <param name="config">The configuration.</param>
 /// <returns>Modified service collection with the ServiceBusMessenger and NamedInstanceFactory{ServiceBusMessenger} configured.</returns>
 public static IServiceCollection AddServiceBusSingleton(this IServiceCollection services, MsiConfig config)
 {
     return(AddNamedInstance <ServiceBusMessenger>(services, null, new ServiceBusMessenger(config)));
 }
        [ExcludeFromCodeCoverage] //excluded as Msi isn't part of the build pipeline for testing.
        public static IConfigurationBuilder AddKeyVaultSecrets(this IConfigurationBuilder builder, MsiConfig config, params string[] keys)
        {
            try
            {
                var vault   = new KeyVault(config);
                var secrets = new List <KeyValuePair <string, string> >();

                // Gather secrets from Key Vault
                foreach (var key in keys)
                {
                    try
                    {
                        var value = vault.GetSecret(key).GetAwaiter().GetResult();
                        secrets.Add(new KeyValuePair <string, string>(key, value));
                    }
                    catch (KeyVaultErrorException e)
                    {
                        // Do nothing if it fails to find the value.
                        Console.WriteLine($"Failed to find keyvault setting: {key}, exception: {e.Message}");
                    }
                }

                // Add them to config.
                if (secrets.Any())
                {
                    builder.AddInMemoryCollection(secrets);
                }

                // Keep track of instance.
                KeyVaultInstance = vault;

                // Return updated builder.
                return(builder);
            }
            catch (Exception ex)
            {
                throw new InvalidOperationException("Problem occurred retrieving secrets from KeyVault using Managed Identity", ex);
            }
        }