/// <summary>
        /// Adds authorisation middleware and services that ensure authentication users have the correct permissions to execute
        /// operations.
        /// </summary>
        /// <remarks>
        /// New middleware builders will be added:
        /// <list type="bullet">
        /// <item><description><see cref="AuthorisationMiddlewareBuilder"/> added to <see cref="MiddlewareStage.Authorisation"/>.</description></item>
        /// </list>
        /// </remarks>
        /// <param name="apiBuilder">The builder to add auth to.</param>
        /// <returns>The builder.</returns>
        public static BlueprintApiBuilder AddAuthorisation(this BlueprintApiBuilder apiBuilder)
        {
            TryAddAuthorisationServices(apiBuilder.Services);

            apiBuilder.Pipeline(p =>
            {
                p.AddMiddleware <AuthorisationMiddlewareBuilder>(MiddlewareStage.Authorisation);
            });

            return(apiBuilder);
        }
        internal PipelineBuilder(BlueprintApiBuilder blueprintApiBuilder)
        {
            this._blueprintApiBuilder = blueprintApiBuilder;

            this.AddMiddleware <MessagePopulationMiddlewareBuilder>(MiddlewareStage.Population);

            this.Add(new OperationExecutorMiddlewareBuilder(), MiddlewareStage.Execution, 0);

            // Special-case this last middleware to have high priority as we MUST have this as the very last middleware, regardless of what else will
            // be registered
            this.Add(new ReturnFrameMiddlewareBuilder(), MiddlewareStage.PostExecution, int.MaxValue);
        }
示例#3
0
        /// <summary>
        /// Conditionally executes the given child action, which means that for example you could include
        /// certain middleware builders based on a configuration switch, or your environment.
        /// </summary>
        /// <param name="apiBuilder">The Api builder.</param>
        /// <param name="include">Whether to include/execute the child action.</param>
        /// <param name="action">The action to perform if <paramref name="include"/> is <c>true</c>.</param>
        /// <returns>This builder.</returns>
        public static BlueprintApiBuilder Conditionally(
            this BlueprintApiBuilder apiBuilder,
            bool include,
            Action <BlueprintApiBuilder> action)
        {
            if (include)
            {
                action(apiBuilder);
            }

            return(apiBuilder);
        }
        /// <summary>
        /// Adds validation middleware, which will use "validation sources" to handle different types of validation that can be
        /// registered against operations.
        /// </summary>
        /// <seealso cref="BlueprintValidationBuilder.UseBlueprintSource" />
        /// <seealso cref="BlueprintValidationBuilder.UseDataAnnotationSource" />
        /// <param name="apiBuilder">The builder to add validation to.</param>
        /// <param name="configure">An action that will be given an instance of <see cref="BlueprintValidationBuilder" /> to configure the validation
        /// middleware.</param>
        /// <returns>The builder.</returns>
        public static BlueprintApiBuilder AddValidation(this BlueprintApiBuilder apiBuilder, Action <BlueprintValidationBuilder> configure)
        {
            apiBuilder.Pipeline(p => p.AddMiddleware <ValidationMiddlewareBuilder>(MiddlewareStage.Validation));

            configure(new BlueprintValidationBuilder(apiBuilder));

            if (apiBuilder.Services.All(s => s.ServiceType != typeof(IValidationSource)))
            {
                throw new InvalidOperationException($"At least one {nameof(IValidationSource)} must be configured");
            }

            return(apiBuilder);
        }
        public static BlueprintApiBuilder AddAuditing(this BlueprintApiBuilder apiBuilder, Action <BlueprintAuditBuilder> configure)
        {
            apiBuilder.Pipeline(p => p.AddMiddleware <AuditMiddleware>(MiddlewareStage.Setup));

            configure(new BlueprintAuditBuilder(apiBuilder));

            if (apiBuilder.Services.All(s => s.ServiceType != typeof(IAuditor)))
            {
                throw new InvalidOperationException($"An {nameof(IAuditor)} must be configured");
            }

            return(apiBuilder);
        }
        /// <summary>
        /// Adds authentication middlewares that will responsible for finding a user through a <see cref="ClaimsIdentity" /> and an
        /// application-specific <see cref="IUserAuthorisationContextFactory"/> for loading a <see cref="IUserAuthorisationContext" /> that will
        /// be available to handlers for authenticated users.
        /// </summary>
        /// <remarks>
        /// Two new middleware builders will be added:
        /// <list type="bullet">
        /// <item><description><see cref="AuthenticationMiddlewareBuilder"/> added to <see cref="MiddlewareStage.Authentication"/>.</description></item>
        /// <item><description><see cref="UserContextLoaderMiddlewareBuilder"/> added to <see cref="MiddlewareStage.Authentication"/>.</description></item>
        /// </list>
        /// </remarks>
        /// <param name="apiBuilder">The builder to add auth to.</param>
        /// <param name="configure">An action to configure authentication pipeline.</param>
        /// <returns>The builder.</returns>
        public static BlueprintApiBuilder AddAuthentication(this BlueprintApiBuilder apiBuilder, Action <BlueprintAuthenticationBuilder> configure)
        {
            TryAddAuthenticationServices(apiBuilder);

            apiBuilder.Pipeline(p =>
            {
                p.AddMiddleware <AuthenticationMiddlewareBuilder>(MiddlewareStage.Authentication);
                p.AddMiddleware <UserContextLoaderMiddlewareBuilder>(MiddlewareStage.Authentication);
            });

            configure(new BlueprintAuthenticationBuilder(apiBuilder));

            if (apiBuilder.Services.All(s => s.ServiceType != typeof(IUserAuthorisationContextFactory)))
            {
                throw new InvalidOperationException($"A {nameof(IUserAuthorisationContextFactory)} must be configured");
            }

            return(apiBuilder);
        }
示例#7
0
        public static BlueprintApiBuilder AddNotifications(this BlueprintApiBuilder blueprintApiBuilder, params Assembly[] embeddedResourceAssemblies)
        {
            if (embeddedResourceAssemblies.Length == 0)
            {
                embeddedResourceAssemblies = new[] { Assembly.GetEntryAssembly() };
            }

            blueprintApiBuilder.Services.AddOptions <TemplatedEmailHandlerOptions>();

            blueprintApiBuilder.Services.AddTransient <INotificationRepository>(p =>
                                                                                new EmbeddedResourceNotificationRepository(embeddedResourceAssemblies, p.GetRequiredService <ILogger <EmbeddedResourceNotificationRepository> >()));

            blueprintApiBuilder.Services.AddTransient <INotificationService, NotificationService>();
            blueprintApiBuilder.Services.AddTransient <INotificationHandler, TemplatedEmailHandler>();
            blueprintApiBuilder.Services.AddTransient <ITemplateFactory, NVelocityTemplateFactory>();
            blueprintApiBuilder.Services.AddTransient <IEmailSender, SmtpClientEmailSender>();

            return(blueprintApiBuilder);
        }
        public static BlueprintApiBuilder AddLogging(this BlueprintApiBuilder apiBuilder)
        {
            apiBuilder.Pipeline(p => p.AddMiddleware <LoggingMiddlewareBuilder>(MiddlewareStage.Setup));

            return(apiBuilder);
        }
 /// <summary>
 /// Adds validation middleware, by default adding both Blueprint and DataAnnotations sources.
 /// </summary>
 /// <seealso cref="BlueprintValidationBuilder.UseBlueprintSource" />
 /// <seealso cref="BlueprintValidationBuilder.UseDataAnnotationSource" />
 /// <param name="apiBuilder">The builder to add validation to.</param>
 /// <returns>The builder.</returns>
 public static BlueprintApiBuilder AddValidation(this BlueprintApiBuilder apiBuilder)
 {
     return(AddValidation(apiBuilder, o => o.UseBlueprintSource().UseDataAnnotationSource()));
 }
示例#10
0
 internal BlueprintCompilationBuilder(BlueprintApiBuilder blueprintApiBuilder)
 {
     this._blueprintApiBuilder = blueprintApiBuilder;
 }
示例#11
0
 internal BlueprintAuthenticationBuilder(BlueprintApiBuilder apiBuilder)
 {
     this._apiBuilder = apiBuilder;
 }
        internal BlueprintValidationBuilder(BlueprintApiBuilder apiBuilder)
        {
            this._apiBuilder = apiBuilder;

            apiBuilder.Services.TryAddSingleton <IValidator, BlueprintValidator>();
        }
示例#13
0
        /// <summary>
        /// Adds StructureMap support to Blueprint by registering an <see cref="InstanceFrameProvider" /> that understands
        /// the implicit registration nature of StructureMap.
        /// </summary>
        /// <param name="blueprintApiBuilder">The builder.</param>
        /// <returns>The builder for further customisation.</returns>
        public static BlueprintApiBuilder AddStructureMap(this BlueprintApiBuilder blueprintApiBuilder)
        {
            blueprintApiBuilder.Services.AddTransient <InstanceFrameProvider, StructureMapInstanceFrameProvider>();

            return(blueprintApiBuilder);
        }
示例#14
0
 public BlueprintAuditBuilder(BlueprintApiBuilder apiBuilder)
 {
     this._apiBuilder = apiBuilder;
 }