using Amazon.AspNetCore.Identity.Cognito; using Amazon.CognitoIdentityProvider; using Amazon.CognitoIdentityProvider.Model; using Amazon.Extensions.CognitoAuthentication; using Microsoft.AspNetCore.Identity; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; namespace CloudMosaic.Frontend { public static class ServiceCollectionExtensions { private const string ConfigurationClientIdKey = "UserPoolClientId"; private const string ConfigurationClientSecretKey = "UserPoolClientSecret"; private const string ConfigurationUserPoolIdKey = "UserPoolId"; public static IServiceCollection AddCognitoIdentityProvider(this IServiceCollection services, IConfiguration configuration) { services.InjectCognitoUser(); services.ConfigureCognitoIdentityProviderClient(configuration); return services; } public static IServiceCollection InjectCognitoUser(this IServiceCollection services) where TUser : CognitoUser { services.AddIdentity().AddDefaultTokenProviders(); services.AddIdentityCore() .AddDefaultTokenProviders() .AddPasswordValidator(); // Updates the manager to use custom stores services.AddTransient, CognitoUserStore>(); // Following only needed if we want to inject custom managers services.AddTransient, CognitoUserManager>(); services.AddTransient, CognitoSignInManager>(); services.AddTransient, CognitoUserStore>(); services.AddTransient, CognitoUserClaimsPrincipalFactory>(); services.AddTransient(); services.AddHttpContextAccessor(); return services; } public static void ConfigureCognitoIdentityProviderClient(this IServiceCollection services, IConfiguration configuration) { var configurationSection = configuration.GetSection("Authentication:Cognito"); var poolclient = new UserPoolClientType { ClientId = configurationSection.GetValue(ConfigurationClientIdKey), ClientSecret = configurationSection.GetValue(ConfigurationClientSecretKey) }; var awsOptions = configuration.GetAWSOptions(); var provider = awsOptions.CreateServiceClient() as AmazonCognitoIdentityProviderClient; var pool = new CognitoUserPool(configurationSection.GetValue(ConfigurationUserPoolIdKey), poolclient.ClientId, provider, poolclient.ClientSecret); services.AddSingleton(typeof(CognitoUserPool), pool); services.AddSingleton(typeof(AmazonCognitoIdentityProviderClient), provider); } } public class CognitoRole { } }