/// <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)); }
/// <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)); }
/// <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); }
/// <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)); }
/// <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)); }