/// <summary>
        /// Registers the OpenIddict ASP.NET Core Data Protection server services in the DI container
        /// and configures OpenIddict to validate and issue ASP.NET Data Protection-based tokens.
        /// </summary>
        /// <param name="builder">The services builder used by OpenIddict to register new services.</param>
        /// <remarks>This extension can be safely called multiple times.</remarks>
        /// <returns>The <see cref="OpenIddictServerBuilder"/>.</returns>
        public static OpenIddictServerDataProtectionBuilder UseDataProtection(this OpenIddictServerBuilder builder)
        {
            if (builder == null)
            {
                throw new ArgumentNullException(nameof(builder));
            }

            builder.Services.AddDataProtection();

            // Register the built-in server event handlers used by the OpenIddict Data Protection components.
            // Note: the order used here is not important, as the actual order is set in the options.
            builder.Services.TryAdd(DefaultHandlers.Select(descriptor => descriptor.ServiceDescriptor));

            // Register the built-in filter used by the default OpenIddict Data Protection event handlers.
            builder.Services.TryAddSingleton <RequireDataProtectionAccessTokenFormatEnabled>();
            builder.Services.TryAddSingleton <RequireDataProtectionAuthorizationCodeFormatEnabled>();
            builder.Services.TryAddSingleton <RequireDataProtectionDeviceCodeFormatEnabled>();
            builder.Services.TryAddSingleton <RequireDataProtectionRefreshTokenFormatEnabled>();
            builder.Services.TryAddSingleton <RequireDataProtectionUserCodeFormatEnabled>();

            // Note: TryAddEnumerable() is used here to ensure the initializers are registered only once.
            builder.Services.TryAddEnumerable(new[]
            {
                ServiceDescriptor.Singleton <IConfigureOptions <OpenIddictServerOptions>, OpenIddictServerDataProtectionConfiguration>(),
                ServiceDescriptor.Singleton <IPostConfigureOptions <OpenIddictServerDataProtectionOptions>, OpenIddictServerDataProtectionConfiguration>()
            });

            return(new OpenIddictServerDataProtectionBuilder(builder.Services));
        }
예제 #2
0
        /// <summary>
        /// Registers the ASP.NET Core MVC services used by OpenIddict.
        /// </summary>
        /// <param name="builder">The services builder used by OpenIddict to register new services.</param>
        /// <remarks>This extension can be safely called multiple times.</remarks>
        /// <returns>The <see cref="OpenIddictMvcBuilder"/>.</returns>
        public static OpenIddictMvcBuilder UseMvc([NotNull] this OpenIddictServerBuilder builder)
        {
            if (builder == null)
            {
                throw new ArgumentNullException(nameof(builder));
            }

            return(RegisterMvcServices(builder.Services));
        }
예제 #3
0
        /// <summary>
        /// Registers the ASP.NET Core MVC model binders used by OpenIddict.
        /// </summary>
        /// <param name="builder">The services builder used by OpenIddict to register new services.</param>
        /// <param name="configuration">The configuration delegate used to configure the MVC services.</param>
        /// <remarks>This extension can be safely called multiple times.</remarks>
        /// <returns>The <see cref="OpenIddictServerBuilder"/>.</returns>
        public static OpenIddictServerBuilder UseMvc(
            [NotNull] this OpenIddictServerBuilder builder,
            [NotNull] Action <OpenIddictMvcBuilder> configuration)
        {
            if (builder == null)
            {
                throw new ArgumentNullException(nameof(builder));
            }

            configuration(builder.UseMvc());

            return(builder);
        }
예제 #4
0
        /// <summary>
        /// Registers the ASP.NET Core MVC services used by OpenIddict.
        /// </summary>
        /// <param name="builder">The services builder used by OpenIddict to register new services.</param>
        /// <remarks>This extension can be safely called multiple times.</remarks>
        /// <returns>The <see cref="OpenIddictMvcBuilder"/>.</returns>
        public static OpenIddictMvcBuilder UseMvc([NotNull] this OpenIddictServerBuilder builder)
        {
            if (builder == null)
            {
                throw new ArgumentNullException(nameof(builder));
            }

            // Register the options initializer used by the OpenIddict MVC binding/validation components.
            // Note: TryAddEnumerable() is used here to ensure the initializer is only registered once.
            builder.Services.TryAddEnumerable(
                ServiceDescriptor.Singleton <IConfigureOptions <MvcOptions>, OpenIddictMvcConfiguration>());

            return(new OpenIddictMvcBuilder(builder.Services));
        }
        /// <summary>
        /// Registers the OpenIddict server Quartz.NET integration in the DI container.
        /// </summary>
        /// <param name="builder">The services builder used by OpenIddict to register new services.</param>
        /// <remarks>This extension can be safely called multiple times.</remarks>
        /// <returns>The <see cref="OpenIddictServerQuartzBuilder"/>.</returns>
        public static OpenIddictServerQuartzBuilder UseQuartz(this OpenIddictServerBuilder builder)
        {
            if (builder == null)
            {
                throw new ArgumentNullException(nameof(builder));
            }

            // Warning: the AddQuartz() method is deliberately not used as it's not idempotent.
            // Calling it at this point may override user-defined services (e.g Quartz DI support).

            builder.Services.TryAddTransient <OpenIddictServerQuartzJob>();

            // To ensure this method can be safely called multiple times, the job details
            // of the OpenIddict server job are only added if no existing IJobDetail instance
            // pointing to OpenIddictServerQuartzJob was already registered in the DI container.
            if (!builder.Services.Any(descriptor => descriptor.ServiceType == typeof(IJobDetail) &&
                                      descriptor.ImplementationInstance is IJobDetail job &&
                                      job.Key.Equals(OpenIddictServerQuartzJob.Identity)))
            {
                builder.Services.AddSingleton(
                    JobBuilder.Create <OpenIddictServerQuartzJob>()
                    .StoreDurably()
                    .WithIdentity(OpenIddictServerQuartzJob.Identity)
                    .WithDescription(SR.GetResourceString(SR.ID9000))
                    .Build());
            }

            // To ensure this method can be safely called multiple times, the trigger details
            // of the OpenIddict server job are only added if no existing ITrigger instance
            // pointing to OpenIddictServerQuartzJob was already registered in the DI container.
            if (!builder.Services.Any(descriptor => descriptor.ServiceType == typeof(ITrigger) &&
                                      descriptor.ImplementationInstance is ITrigger trigger &&
                                      trigger.JobKey.Equals(OpenIddictServerQuartzJob.Identity)))
            {
                // Note: this trigger uses a quite long interval (1 hour), which means it may be
                // potentially never reached if the application is shut down or recycled. As such,
                // this trigger is set up to fire immediately to ensure it's executed at least once.
                builder.Services.AddSingleton(
                    TriggerBuilder.Create()
                    .ForJob(OpenIddictServerQuartzJob.Identity)
                    .WithSimpleSchedule(options => options.WithIntervalInHours(1).RepeatForever())
                    .WithDescription(SR.GetResourceString(SR.ID9001))
                    .StartNow()
                    .Build());
            }

            return(new OpenIddictServerQuartzBuilder(builder.Services));
        }
        /// <summary>
        /// Registers the OpenIddict server services for OWIN in the DI container.
        /// </summary>
        /// <param name="builder">The services builder used by OpenIddict to register new services.</param>
        /// <param name="configuration">The configuration delegate used to configure the server services.</param>
        /// <remarks>This extension can be safely called multiple times.</remarks>
        /// <returns>The <see cref="OpenIddictServerBuilder"/>.</returns>
        public static OpenIddictServerBuilder UseOwin(
            this OpenIddictServerBuilder builder, Action <OpenIddictServerOwinBuilder> configuration)
        {
            if (builder is null)
            {
                throw new ArgumentNullException(nameof(builder));
            }

            if (configuration is null)
            {
                throw new ArgumentNullException(nameof(configuration));
            }

            configuration(builder.UseOwin());

            return(builder);
        }
        /// <summary>
        /// Registers the OpenIddict server services for ASP.NET Core in the DI container.
        /// </summary>
        /// <param name="builder">The services builder used by OpenIddict to register new services.</param>
        /// <param name="configuration">The configuration delegate used to configure the server services.</param>
        /// <remarks>This extension can be safely called multiple times.</remarks>
        /// <returns>The <see cref="OpenIddictServerBuilder"/>.</returns>
        public static OpenIddictServerBuilder UseAspNetCore(
            this OpenIddictServerBuilder builder, Action <OpenIddictServerAspNetCoreBuilder> configuration)
        {
            if (builder == null)
            {
                throw new ArgumentNullException(nameof(builder));
            }

            if (configuration == null)
            {
                throw new ArgumentNullException(nameof(configuration));
            }

            configuration(builder.UseAspNetCore());

            return(builder);
        }
        /// <summary>
        /// Registers the OpenIddict server services for ASP.NET Core in the DI container.
        /// </summary>
        /// <param name="builder">The services builder used by OpenIddict to register new services.</param>
        /// <remarks>This extension can be safely called multiple times.</remarks>
        /// <returns>The <see cref="OpenIddictServerAspNetCoreBuilder"/>.</returns>
        public static OpenIddictServerAspNetCoreBuilder UseAspNetCore(this OpenIddictServerBuilder builder)
        {
            if (builder == null)
            {
                throw new ArgumentNullException(nameof(builder));
            }

            builder.Services.AddAuthentication();

            builder.Services.TryAddScoped <OpenIddictServerAspNetCoreHandler>();

            // Register the built-in event handlers used by the OpenIddict ASP.NET Core server components.
            // Note: the order used here is not important, as the actual order is set in the options.
            builder.Services.TryAdd(DefaultHandlers.Select(descriptor => descriptor.ServiceDescriptor));

            // Register the built-in filters used by the default OpenIddict ASP.NET Core server event handlers.
            builder.Services.TryAddSingleton <RequireAuthorizationEndpointCachingEnabled>();
            builder.Services.TryAddSingleton <RequireAuthorizationEndpointPassthroughEnabled>();
            builder.Services.TryAddSingleton <RequireErrorPassthroughEnabled>();
            builder.Services.TryAddSingleton <RequireHttpRequest>();
            builder.Services.TryAddSingleton <RequireLogoutEndpointCachingEnabled>();
            builder.Services.TryAddSingleton <RequireLogoutEndpointPassthroughEnabled>();
            builder.Services.TryAddSingleton <RequireTransportSecurityRequirementEnabled>();
            builder.Services.TryAddSingleton <RequireStatusCodePagesIntegrationEnabled>();
            builder.Services.TryAddSingleton <RequireTokenEndpointPassthroughEnabled>();
            builder.Services.TryAddSingleton <RequireUserinfoEndpointPassthroughEnabled>();
            builder.Services.TryAddSingleton <RequireVerificationEndpointPassthroughEnabled>();

            // Register the option initializer used by the OpenIddict ASP.NET Core server integration services.
            // Note: TryAddEnumerable() is used here to ensure the initializers are only registered once.
            builder.Services.TryAddEnumerable(new[]
            {
                ServiceDescriptor.Singleton <IConfigureOptions <AuthenticationOptions>, OpenIddictServerAspNetCoreConfiguration>(),
                ServiceDescriptor.Singleton <IPostConfigureOptions <AuthenticationOptions>, OpenIddictServerAspNetCoreConfiguration>(),

                ServiceDescriptor.Singleton <IConfigureOptions <OpenIddictServerOptions>, OpenIddictServerAspNetCoreConfiguration>(),

                ServiceDescriptor.Singleton <IPostConfigureOptions <OpenIddictServerAspNetCoreOptions>, OpenIddictServerAspNetCoreConfiguration>()
            });

            return(new OpenIddictServerAspNetCoreBuilder(builder.Services));
        }
        /// <summary>
        /// Registers the OpenIddict server services for OWIN in the DI container.
        /// </summary>
        /// <param name="builder">The services builder used by OpenIddict to register new services.</param>
        /// <remarks>This extension can be safely called multiple times.</remarks>
        /// <returns>The <see cref="OpenIddictServerOwinBuilder"/>.</returns>
        public static OpenIddictServerOwinBuilder UseOwin(this OpenIddictServerBuilder builder)
        {
            if (builder is null)
            {
                throw new ArgumentNullException(nameof(builder));
            }

            builder.Services.AddWebEncoders();

            // Note: unlike regular OWIN middleware, the OpenIddict server middleware is registered
            // as a scoped service in the DI container. This allows containers that support middleware
            // resolution (like Autofac) to use it without requiring additional configuration.
            builder.Services.TryAddScoped <OpenIddictServerOwinMiddleware>();

            // Register the built-in event handlers used by the OpenIddict OWIN server components.
            // Note: the order used here is not important, as the actual order is set in the options.
            builder.Services.TryAdd(DefaultHandlers.Select(descriptor => descriptor.ServiceDescriptor));

            // Register the built-in filters used by the default OpenIddict OWIN server event handlers.
            builder.Services.TryAddSingleton <RequireAuthorizationRequestCachingEnabled>();
            builder.Services.TryAddSingleton <RequireAuthorizationEndpointPassthroughEnabled>();
            builder.Services.TryAddSingleton <RequireErrorPassthroughEnabled>();
            builder.Services.TryAddSingleton <RequireLogoutRequestCachingEnabled>();
            builder.Services.TryAddSingleton <RequireLogoutEndpointPassthroughEnabled>();
            builder.Services.TryAddSingleton <RequireTransportSecurityRequirementEnabled>();
            builder.Services.TryAddSingleton <RequireOwinRequest>();
            builder.Services.TryAddSingleton <RequireTokenEndpointPassthroughEnabled>();
            builder.Services.TryAddSingleton <RequireUserinfoEndpointPassthroughEnabled>();
            builder.Services.TryAddSingleton <RequireVerificationEndpointPassthroughEnabled>();

            // Register the option initializers used by the OpenIddict OWIN server integration services.
            // Note: TryAddEnumerable() is used here to ensure the initializers are only registered once.
            builder.Services.TryAddEnumerable(new[]
            {
                ServiceDescriptor.Singleton <IConfigureOptions <OpenIddictServerOptions>, OpenIddictServerOwinConfiguration>(),
                ServiceDescriptor.Singleton <IPostConfigureOptions <OpenIddictServerOwinOptions>, OpenIddictServerOwinConfiguration>()
            });

            return(new OpenIddictServerOwinBuilder(builder.Services));
        }
예제 #10
0
        /// <summary>
        /// Registers the ASP.NET Core MVC services used by OpenIddict.
        /// </summary>
        /// <param name="builder">The services builder used by OpenIddict to register new services.</param>
        /// <remarks>This extension can be safely called multiple times.</remarks>
        /// <returns>The <see cref="OpenIddictMvcBuilder"/>.</returns>
        public static OpenIddictMvcBuilder UseMvc([NotNull] this OpenIddictServerBuilder builder)
        {
            if (builder == null)
            {
                throw new ArgumentNullException(nameof(builder));
            }

            builder.Services.Configure <MvcOptions>(options =>
            {
                // Skip the binder registration if it was already added to the providers collection.
                for (var index = 0; index < options.ModelBinderProviders.Count; index++)
                {
                    var provider = options.ModelBinderProviders[index];
                    if (provider is OpenIddictMvcBinderProvider)
                    {
                        return;
                    }
                }

                options.ModelBinderProviders.Insert(0, new OpenIddictMvcBinderProvider());
            });

            return(new OpenIddictMvcBuilder(builder.Services));
        }