using System; using IdentityModel.AspNetCore.OAuth2Introspection; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using xCommons.Authorization; using xCommons.Extensions; using xIdentityService.Configuration; using xIdentityService.Constants; using xIdentityService.Interfaces; using xIdentityService.Providers; using xIdentityService.Security; namespace xIdentityService.DI { public static partial class XDIHelperExtension { /// /// Extract Module Configuration Structure from IConfiguration interface /// /// /// public static XIdentityServiceConfiguration GetXIdentityServiceConfiguration (this IConfiguration config) { // var xIdentityServiceConfigSection = config.GetSection (ConfigurationNodeNames.IDENTITY_SERVICE_NODE_NAME); return xIdentityServiceConfigSection.Get (); } /// /// Register Service and All it's Requirements /// /// /// public static void AddXIdentityService ( this IServiceCollection services, IConfiguration configuration, ServiceLifetime lifeTime = ServiceLifetime.Singleton ) { // var identityConfiguration = configuration.GetXIdentityServiceConfiguration (); AddIdentityService ( services, identityConfiguration, lifeTime ); } /// /// Register Service and All it's Requirements /// /// /// public static void AddXIdentityService ( this IServiceCollection services, XIdentityServiceConfiguration configuration, ServiceLifetime lifeTime = ServiceLifetime.Singleton ) { AddIdentityService (services, configuration, lifeTime); } /// /// Register Custome Token Provider /// /// /// public static void AddXTokenProvider ( this IServiceCollection services, ServiceLifetime lifetime = ServiceLifetime.Singleton) where T : IXTokenProvider { // Console.WriteLine ("IdentityService: Add Custom Token Provider ..."); services.Add (new ServiceDescriptor (typeof (IXTokenProvider), typeof (T), lifetime)); } /// /// Use Authentication /// /// public static void UseXIdentityService (this IApplicationBuilder app) { app.UseAuthentication (); } // #region Private ... private static void AddIdentityService ( this IServiceCollection services, XIdentityServiceConfiguration config, ServiceLifetime lifeTime = ServiceLifetime.Singleton ) { // services.AddSingleton (config); // var builder = services .AddAuthentication (XAuthenticationScheme.XToken.GetStringValue ()); // // Add JWT Handler ... builder.AddJwtBearer ( XAuthenticationScheme.XToken.GetStringValue (), options => { // options.Authority = config.Authority; options.TokenValidationParameters.ValidateAudience = false; options.TokenValidationParameters.ValidTypes = new [] { "at+jwt" }; // options.ForwardDefaultSelector = context => { // var path = context.Request.Path.Value; // var fromHeader = TokenRetrieval.FromAuthorizationHeader (); var fromQuery = TokenRetrieval.FromQueryString (); var bearerToken = fromHeader (context.Request) ?? fromQuery (context.Request); // var result = XAuthenticationScheme.XToken.GetStringValue (); if (!bearerToken.IsNull () && !bearerToken.Contains (".")) { result = XAuthenticationScheme.XIntrospection.GetStringValue (); } // return result; }; }); // // Add OAuthIntrospect ... builder.AddOAuth2Introspection ( XAuthenticationScheme.XIntrospection.GetStringValue (), options => { // options.Authority = config.Authority; options.ClientId = config.ApiName; options.ClientSecret = config.ClientSecret; // options.TokenRetriever = new Func (req => { // var fromHeader = TokenRetrieval.FromAuthorizationHeader (); var fromQuery = TokenRetrieval.FromQueryString (); // var bearerToken = fromHeader (req) ?? fromQuery (req); // return bearerToken; }); }); // // Register Authorization Handler ... services.AddSingleton (); Console.WriteLine ("IdentityService: register Authorization Handlers ..."); // // Register Identity Provider ... services.Add (new ServiceDescriptor (typeof (IXIdentityProvider), typeof (XIdentityProvider), lifeTime)); Console.WriteLine ("IdentityService: Register IdentityProvider ..."); // // Try To Register InMemoryTokenProvier if it's not Provided ... IXTokenProvider xTokenProvider = null; try { xTokenProvider = services.GetRegisteredService (); } catch { } if (xTokenProvider.IsNull ()) { // Console.WriteLine ("IdentityService: there is no Custom Token Provider, Adding InMemoryTokenProvider instead ..."); services.Add (new ServiceDescriptor (typeof (IXTokenProvider), typeof (XInMemoryTokenProvider), lifeTime)); } // // Adding Security Provider ... services.Add (new ServiceDescriptor (typeof (IXSecurityProvider), typeof (XSecurityProvider), lifeTime)); Console.WriteLine ("IdentityService: Register Security Provider ..."); } #endregion } }