/// <summary>
        ///   Acquires a JWT token for use with the Event Hubs management client.
        /// </summary>
        ///
        /// <returns>The token to use for management operations against the Event Hubs Live test namespace.</returns>
        ///
        public async Task <string> AquireManagementTokenAsync()
        {
            ManagementToken token = s_managementToken;

            // If there was no current token, or it is within the buffer for expiration, request a new token.
            // There is a benign race condition here, where there may be multiple requests in-flight for a new token.  Since
            // this is test infrastructure, just allow the acquired token to replace the current one without attempting to
            // coordinate or ensure that the most recent is kept.

            if ((token == null) || (token.ExpiresOn <= DateTimeOffset.UtcNow.Add(CredentialRefreshBuffer)))
            {
                var credential = new ClientCredential(TestEnvironment.EventHubsClient, TestEnvironment.EventHubsSecret);
                var context    = new AuthenticationContext($"https://login.windows.net/{ TestEnvironment.EventHubsTenant }");
                AuthenticationResult result = await context.AcquireTokenAsync("https://management.core.windows.net/", credential).ConfigureAwait(false);

                if ((string.IsNullOrEmpty(result?.AccessToken)))
                {
                    throw new AuthenticationException("Unable to acquire an Active Directory token for the Event Hubs management client.");
                }

                token = new ManagementToken(result.AccessToken, result.ExpiresOn);
                Interlocked.Exchange(ref s_managementToken, token);
            }

            return(token.Token);
        }
        /// <summary>
        ///   Acquires a JWT token for use with the  Service Bus management client.
        /// </summary>
        ///
        /// <returns>The token to use for management operations against the  Service Bus Live test namespace.</returns>
        ///
        private static async Task <string> AquireManagementTokenAsync()
        {
            ManagementToken token = s_managementToken;

            // If there was no current token, or it is within the buffer for expiration, request a new token.
            // There is a benign race condition here, where there may be multiple requests in-flight for a new token.  Since
            // this is test infrastructure, just allow the acquired token to replace the current one without attempting to
            // coordinate or ensure that the most recent is kept.

            if ((token == null) || (token.ExpiresOn <= DateTimeOffset.UtcNow.Add(CredentialRefreshBuffer)))
            {
                var credential = new ClientCredential(ServiceBusTestEnvironment.Instance.ClientId, ServiceBusTestEnvironment.Instance.ClientSecret);
                var context    = new AuthenticationContext($"{ ServiceBusTestEnvironment.Instance.AuthorityHostUrl }{ ServiceBusTestEnvironment.Instance.TenantId }");
                var result     = await context.AcquireTokenAsync(ServiceBusTestEnvironment.Instance.ServiceManagementUrl, credential);

                if ((string.IsNullOrEmpty(result?.AccessToken)))
                {
                    throw new AuthenticationException("Unable to acquire an Active Directory token for the  Service Bus management client.");
                }

                token = new ManagementToken(result.AccessToken, result.ExpiresOn);
                Interlocked.Exchange(ref s_managementToken, token);
            }

            return(token.Token);
        }
示例#3
0
        /// <summary>
        /// Maps the OData service.
        /// </summary>
        /// <param name="config">The current HTTP configuration.</param>
        /// <param name="builder">The EDM model builder.</param>
        /// <param name="routeName">The name of the route (<see cref="DataObjectRoutingConventions.DefaultRouteName"/> be default).</param>
        /// <param name="routePrefix">The route prefix (<see cref="DataObjectRoutingConventions.DefaultRoutePrefix"/> be default).</param>
        /// <returns>OData service registration token.</returns>
        public static ManagementToken MapODataServiceDataObjectRoute(
            this HttpConfiguration config,
            IDataObjectEdmModelBuilder builder,
            string routeName   = DataObjectRoutingConventions.DefaultRouteName,
            string routePrefix = DataObjectRoutingConventions.DefaultRoutePrefix)
        {
            Contract.Requires <ArgumentNullException>(config != null);
            Contract.Requires <ArgumentNullException>(builder != null);
            Contract.Requires <ArgumentNullException>(routeName != null);
            Contract.Requires <ArgumentException>(routeName != string.Empty);
            Contract.Requires <ArgumentNullException>(routePrefix != null);
            Contract.Requires <ArgumentException>(routePrefix != string.Empty);

            // Model.
            var model = builder.Build();

            // Routing.
            var pathHandler        = new ExtendedODataPathHandler();
            var routingConventions = DataObjectRoutingConventions.CreateDefault();
            var route = config.MapODataServiceRoute(routeName, routePrefix, model, pathHandler, routingConventions);

            // Controllers.
            var registeredActivator = (IHttpControllerActivator)config.Services.GetService(typeof(IHttpControllerActivator));
            var fallbackActivator   = registeredActivator ?? new DefaultHttpControllerActivator();

            config.Services.Replace(typeof(IHttpControllerActivator), new DataObjectControllerActivator(fallbackActivator));

            // Formatters.
            var customODataSerializerProvider     = new CustomODataSerializerProvider();
            var extendedODataDeserializerProvider = new ExtendedODataDeserializerProvider();
            var odataFormatters = ODataMediaTypeFormatters.Create(customODataSerializerProvider, extendedODataDeserializerProvider);

            config.Formatters.InsertRange(0, odataFormatters);
            config.Properties[typeof(CustomODataSerializerProvider)] = customODataSerializerProvider;

            // Token.
            var token = new ManagementToken(route, model);

            config.SetODataServiceToken(token);

            // Handlers.
            if (config.MessageHandlers.FirstOrDefault(h => h is PostPatchHandler) == null)
            {
                config.MessageHandlers.Add(new PostPatchHandler());
            }

            return(token);
        }
        /// <summary>
        /// Initializes a new instance of the <see cref="PerRequestUpdateEdmModelHandler"/> class.
        /// </summary>
        /// <param name="token">The OData Service management token.</param>
        /// <param name="modelBuilder">
        /// The model builder for updating model.
        /// Each request EDM model associated with <paramref name="token"/> will be updated.
        /// </param>
        public PerRequestUpdateEdmModelHandler(ManagementToken token, IDataObjectEdmModelBuilder modelBuilder)
        {
            Contract.Requires <ArgumentNullException>(token != null);
            Contract.Requires <ArgumentNullException>(modelBuilder != null);

            // In current Microsoft implementation of OData for WebAPI, EDM model is stored
            // in ODataPathRouteConstraint, but doesn't have public setter.
            // In order to rebuild EDM model for different requests (e.g. authorized users),
            // this handler uses reflection for private setter calling.
            _edmModelProperty = typeof(ODataPathRouteConstraint).GetProperty("EdmModel");
            if (_edmModelProperty == null)
            {
                throw new InvalidOperationException("Current OData API cannot be used for editing EDM model.");
            }

            _token        = token;
            _modelBuilder = modelBuilder;
        }
示例#5
0
        private static async Task <string> AquireManagementTokenAsync()
        {
            var token = s_managementToken;

            if ((token == null) || (token.ExpiresOn <= DateTimeOffset.UtcNow.Add(CredentialRefreshBuffer)))
            {
                var credential = new ClientCredential(TestUtility.EventHubsClient, TestUtility.EventHubsSecret);
                var context    = new AuthenticationContext($"{ TestUtility.AuthorityHost }{ TestUtility.EventHubsTenant }");
                var result     = await context.AcquireTokenAsync(TestUtility.ServiceManagementUrl, credential).ConfigureAwait(false);

                if ((String.IsNullOrEmpty(result?.AccessToken)))
                {
                    throw new AuthenticationException("Unable to acquire an Active Directory token for the Event Hubs management client.");
                }

                token = new ManagementToken(result.AccessToken, result.ExpiresOn);
                Interlocked.Exchange(ref s_managementToken, token);
            }

            return(token.Token);
        }
        /// <summary>
        /// Initializes a new instance of the <see cref="FunctionContainer"/> class.
        /// </summary>
        /// <param name="token">The OData Service token.</param>
        public FunctionContainer(ManagementToken token)
        {
            Contract.Requires <ArgumentNullException>(token != null);

            _token = token;
        }
示例#7
0
 /// <summary>
 /// Sets the OData Service token to the configuration for internal purposes.
 /// </summary>
 /// <param name="config">The current HTTP configuration.</param>
 /// <param name="token">The OData Service token.</param>
 private static void SetODataServiceToken(this HttpConfiguration config, ManagementToken token)
 {
     config.Properties[token.Route] = token;
 }