143 lines
8.2 KiB
C#
143 lines
8.2 KiB
C#
using DigitalData.Core.Abstractions.Security;
|
|
using DigitalData.Core.Security.Config;
|
|
using DigitalData.Core.Security.Cryptographer;
|
|
using Microsoft.Extensions.Configuration;
|
|
using Microsoft.Extensions.DependencyInjection;
|
|
using Microsoft.Extensions.Options;
|
|
using System.Security.Claims;
|
|
|
|
namespace DigitalData.Core.Security
|
|
{
|
|
public static class DIExtensions
|
|
{
|
|
private static (bool Added, object Lock) _mappingProfile = (false, new());
|
|
private static IServiceCollection AddMappingProfile(this IServiceCollection services)
|
|
{
|
|
if (_mappingProfile.Added)
|
|
return services;
|
|
|
|
lock (_mappingProfile.Lock)
|
|
{
|
|
if (_mappingProfile.Added)
|
|
return services;
|
|
|
|
_mappingProfile.Added = true;
|
|
return services
|
|
.AddAutoMapper(typeof(MappingProfile).Assembly)
|
|
.AddSingleton<TokenDescriptorProvider>();
|
|
}
|
|
}
|
|
|
|
private static IServiceCollection AddParamsConfigureOptions<TParams>(this IServiceCollection services) where TParams : RSAFactoryParams
|
|
=> services.AddSingleton<IConfigureOptions<TParams>, ParamsConfigureOptions<TParams>>();
|
|
|
|
private static IServiceCollection AddAsymCryptService<TAsymCryptParams>(this IServiceCollection services, bool setAsDefault = false) where TAsymCryptParams : AsymCryptParams
|
|
{
|
|
services.AddParamsConfigureOptions<TAsymCryptParams>().AddMappingProfile();
|
|
return setAsDefault
|
|
? services.AddSingleton<IAsymCryptService, AsymCryptService<TAsymCryptParams>>()
|
|
: services.AddSingleton<IAsymCryptService<TAsymCryptParams>, AsymCryptService<TAsymCryptParams>>();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Registers a custom asym crypt service with specified parameters from the given configuration section.
|
|
/// </summary>
|
|
/// <typeparam name="TAsymCryptParams"></typeparam>
|
|
/// <param name="services"></param>
|
|
/// <param name="section"></param>
|
|
/// <param name="setAsDefault">If true, the factory is registered as the default <see cref="IRSAFactory"/>. Otherwise, it is registered as <see cref="IRSAFactory{TRSAFactoryParams}"/>.</param>
|
|
/// <returns></returns>
|
|
public static IServiceCollection AddAsymCryptService<TAsymCryptParams>(this IServiceCollection services, IConfigurationSection section, bool setAsDefault = false) where TAsymCryptParams : AsymCryptParams => services
|
|
.Configure<TAsymCryptParams>(section)
|
|
.AddAsymCryptService<TAsymCryptParams>(setAsDefault: setAsDefault);
|
|
|
|
/// <summary>
|
|
/// Registers a custom asym crypt service with default parameters from the given configuration section.
|
|
/// </summary>
|
|
/// <param name="services"></param>
|
|
/// <param name="section"></param>
|
|
/// <param name="setAsDefault"></param>
|
|
/// <returns></returns>
|
|
public static IServiceCollection AddAsymCryptService(this IServiceCollection services, IConfigurationSection section, bool setAsDefault = false)
|
|
=> services.Configure<AsymCryptParams>(section).AddAsymCryptService<AsymCryptParams>(setAsDefault: setAsDefault);
|
|
|
|
/// <summary>
|
|
/// Registers an asym crypt service with the specified parameters from the given instance. Optionally, sets it as the default factory.
|
|
/// </summary>
|
|
/// <typeparam name="TAsymCryptParams"></typeparam>
|
|
/// <param name="services"></param>
|
|
/// <param name="param"></param>
|
|
/// <param name="setAsDefault">If true, the factory is registered as the default <see cref="IRSAFactory"/>. Otherwise, it is registered as <see cref="IRSAFactory{TRSAFactoryParams}"/>.</param>
|
|
/// <returns></returns>
|
|
public static IServiceCollection AddAsymCryptService<TAsymCryptParams>(this IServiceCollection services, TAsymCryptParams param, bool setAsDefault = false) where TAsymCryptParams : AsymCryptParams => services
|
|
.AddSingleton(Options.Create(param))
|
|
.AddAsymCryptService<TAsymCryptParams>(setAsDefault: setAsDefault);
|
|
|
|
/// <summary>
|
|
/// Registers default asym crypt service with the specified parameters from the given instance.
|
|
/// </summary>
|
|
/// <param name="services"></param>
|
|
/// <param name="param"></param>
|
|
/// <returns></returns>
|
|
public static IServiceCollection AddAsymCryptService(this IServiceCollection services, AsymCryptParams param) => services
|
|
.AddAsymCryptService(param: param, setAsDefault: true);
|
|
|
|
/// <summary>
|
|
/// Registers default RSA Factory instance with default params
|
|
/// </summary>
|
|
/// <param name="services"></param>
|
|
/// <param name="factoryParams"></param>
|
|
/// <returns>The updated <see cref="IServiceCollection"/> with the RSA Factory registered.</returns>
|
|
public static IServiceCollection AddRSAFactory(this IServiceCollection services, RSAFactoryParams? factoryParams = null) => services
|
|
.AddParamsConfigureOptions<RSAFactoryParams>()
|
|
.AddMappingProfile()
|
|
.AddScoped<IRSAFactory>(_ => new RSAFactory<RSAFactoryParams>(Options.Create(factoryParams ?? new())));
|
|
|
|
/// <summary>
|
|
/// Registers a custom RSA Factory with specified parameters from the given configuration section.
|
|
/// </summary>
|
|
/// <typeparam name="TRSAFactoryParams"></typeparam>
|
|
/// <param name="services"></param>
|
|
/// <param name="section"></param>
|
|
/// <param name="setAsDefault">If true, the factory is registered as the default <see cref="IRSAFactory"/>. Otherwise, it is registered as <see cref="IRSAFactory{TRSAFactoryParams}"/>.</param>
|
|
/// <returns>The updated <see cref="IServiceCollection"/> with the RSA Factory registered.</returns>
|
|
public static IServiceCollection AddRSAFactory<TRSAFactoryParams>(this IServiceCollection services, IConfigurationSection section, bool setAsDefault = false)
|
|
where TRSAFactoryParams : RSAFactoryParams
|
|
{
|
|
services.AddMappingProfile().AddParamsConfigureOptions<TRSAFactoryParams>().Configure<TRSAFactoryParams>(section);
|
|
return setAsDefault
|
|
? services.AddSingleton<IRSAFactory, RSAFactory<TRSAFactoryParams>>()
|
|
: services.AddSingleton<IRSAFactory<TRSAFactoryParams>, RSAFactory<TRSAFactoryParams>>();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Registers an RSA Factory with the specified parameters from the given instance. Optionally, sets it as the default factory.
|
|
/// </summary>
|
|
/// <typeparam name="TRSAFactoryParams">The type of the RSA factory parameters.</typeparam>
|
|
/// <param name="services"></param>
|
|
/// <param name="rsaParams"></param>
|
|
/// <param name="setAsDefault">If true, the factory is registered as the default <see cref="IRSAFactory"/>. Otherwise, it is registered as <see cref="IRSAFactory{TRSAFactoryParams}"/>.</param>
|
|
/// <returns>The updated <see cref="IServiceCollection"/> with the RSA Factory registered.</returns>
|
|
public static IServiceCollection AddRSAFactory<TRSAFactoryParams>(this IServiceCollection services, TRSAFactoryParams rsaParams, bool setAsDefault = false)
|
|
where TRSAFactoryParams : RSAFactoryParams
|
|
{
|
|
services.AddMappingProfile().AddSingleton(Options.Create(rsaParams));
|
|
return setAsDefault
|
|
? services.AddParamsConfigureOptions<TRSAFactoryParams>().AddSingleton<IRSAFactory, RSAFactory<TRSAFactoryParams>>()
|
|
: services.AddParamsConfigureOptions<TRSAFactoryParams>().AddSingleton<IRSAFactory<TRSAFactoryParams>, RSAFactory<TRSAFactoryParams>>();
|
|
}
|
|
|
|
private static IServiceCollection AddClaimDescriptor<TPrincipal>(this IServiceCollection services,
|
|
Func<TPrincipal, IDictionary<string, object>>? claimsMapper = null,
|
|
Func<TPrincipal, ClaimsIdentity>? subjectMapper = null)
|
|
{
|
|
var descriptor = new ClaimDescriptor<TPrincipal>
|
|
{
|
|
CreateClaims = claimsMapper,
|
|
CreateSubject = subjectMapper
|
|
};
|
|
|
|
return services.AddSingleton(sp => Options.Create(descriptor));
|
|
}
|
|
}
|
|
} |