22 Commits

Author SHA1 Message Date
Developer 02
a94c7249e4 chore(DigitalData.Core.Security): Aktualisiert auf Version 1.1.0 2025-03-14 14:11:37 +01:00
Developer 02
3f8145e6dc chore(DigitalData.Core.Abstractions): Aktualisiert auf Version 3.4.0 2025-03-14 14:08:54 +01:00
Developer 02
f3f65415e1 feat(project): Hinzufügen von Paketmetadaten für NuGet-Veröffentlichung
- Hinzufügen der erforderlichen Metadaten zur Projektdatei für die Erstellung eines NuGet-Pakets, einschließlich PackageId, Versionsdetails, Autorenschaft, Urheberrecht, Beschreibung und Repository-Informationen. Außerdem wurde eine Icon-Referenz für eine verbesserte Paketdarstellung hinzugefügt.
2025-03-14 14:02:08 +01:00
Developer 02
192a93d153 refactor(DigitalData.Core.Security.RSAKey.Base): Ordnerverzeichnisse und Namespaces geordnet 2025-03-14 12:32:40 +01:00
Developer 02
9ec9bcd474 chore(DigitalData.Core.Abstractions.Security): DigitalData.Core.Abstractions/Security zu einem eigenen Projekt gemacht 2025-03-14 12:04:38 +01:00
Developer 02
7dd8271f4a feat(RSAParams): Merged CryptoFactoryParams and RSAFactoryParams 2025-03-14 11:14:18 +01:00
Developer 02
b8de148c52 refactor: Umbenennung von CryptoFactory in RSAPool und ICryptoFactory in IAsymmetricKeyPool 2025-03-14 10:47:28 +01:00
Developer 02
0523308083 feat(RSAKey): Unterverzeichnisse auth, base und crypto erstellt und zugehörige RSA-Klassen verschoben 2025-03-14 10:22:52 +01:00
Developer 02
875692b578 chore: move CryptoFactory, JwtSignatureHandler and RSAFactory under Services 2025-03-14 10:15:50 +01:00
Developer 02
973a5f1023 refactor(Instance): removed.
- Moved statc RSAFactory instance to RSAFactory
2025-03-14 10:08:33 +01:00
Developer 02
8498dc0456 refactor(RSAFactory): params-Abhängigkeit durch Ersetzen von params.Defaults entfernt 2025-03-14 09:37:24 +01:00
Developer 02
6a12ad77ec refactor(PemFileInitalizer): Die Methode ExecuteAsync wurde vereinfacht.
- Die Logger-Inject-Funktion wurde obligatorisch gemacht.
 - Der try catch-Blog wurde so konfiguriert, dass die Ausnahme in jedem Fall protokolliert wird.
2025-03-14 09:11:04 +01:00
Developer 02
144fe86987 refactor(CryptoFactoryParams): PemFileInitalizer erstellt, um das Lesen und Aktualisieren von Pem-Dateien zu ermöglichen.
- Minimierung der di-Erweiterungsmethoden.
 - AfterCreate-Methode entfernt
2025-03-13 17:10:22 +01:00
Developer 02
528a346883 feat(ServiceResultExtensions): Erstellt, um die Serviceergebnisse zu verwalten.
- Aufgerüstet auf 3.3.0
2025-01-23 11:29:57 +01:00
Developer 02
a7fb97de4a chore(DTO9: Hochgestuft auf 2.0.1 2025-01-20 14:09:09 +01:00
Developer 02
c3dbc1ec54 refactor(DTOExtensions): Nachrichten nullbar gemacht und aktualisiert, um Null-Nachrichten zu filtern, um den Localizer nullbar machen zu können und so die Localizer-Abhängigkeit zu vermeiden. 2025-01-20 13:53:01 +01:00
Developer 02
a86989479f refactor(Application): hochgestuft auf 3.2 2025-01-20 10:18:13 +01:00
Developer 02
53427282c5 refactor(Abstraktionen): hochgestuft auf 3.2 2025-01-20 10:17:10 +01:00
Developer 02
90c85814b0 refactor(DirectorySearchService): Methoden asynchron gemacht 2025-01-17 11:24:30 +01:00
Developer 02
92a7b959ab chore: unnötige Dateien entfernt und git ignore aktualisiert. 2025-01-16 22:38:05 +01:00
Developer 02
63ab47a288 refactor(DirectorySearchOptions): Machen Sie ServerName und Root erforderlich und UserCacheExpirationDays nullable double. 2025-01-16 22:28:36 +01:00
Developer 02
725b186db6 refactor(DIExtensions): AddDirectorySearchService-Methode entfernt und AddDirectorySearchService aktualisiert, um über Konfigurationseinstellungen konfiguriert werden zu können. 2025-01-15 17:22:14 +01:00
130 changed files with 1255 additions and 2149 deletions

55
.gitignore vendored
View File

@@ -1,7 +1,8 @@
# ---> VisualStudio
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
##
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore
# User-specific files
*.rsuser
@@ -29,7 +30,6 @@ x86/
bld/
[Bb]in/
[Oo]bj/
[Oo]ut/
[Ll]og/
[Ll]ogs/
@@ -91,6 +91,7 @@ StyleCopReport.xml
*.tmp_proj
*_wpftmp.csproj
*.log
*.tlog
*.vspscc
*.vssscc
.builds
@@ -294,6 +295,17 @@ node_modules/
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
*.vbw
# Visual Studio 6 auto-generated project file (contains which files were open etc.)
*.vbp
# Visual Studio 6 workspace and project file (working project files containing files to include in project)
*.dsw
*.dsp
# Visual Studio 6 technical files
*.ncb
*.aps
# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
@@ -350,6 +362,9 @@ ASALocalRun/
# Local History for Visual Studio
.localhistory/
# Visual Studio History (VSHistory) files
.vshistory/
# BeatPulse healthcheck temp database
healthchecksdb
@@ -361,6 +376,42 @@ MigrationBackup/
# Fody - auto-generated XML schema
FodyWeavers.xsd
# VS Code files for those working on multiple tools
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json
*.code-workspace
# Local History for Visual Studio Code
.history/
# Windows Installer files from build outputs
*.cab
*.msi
*.msix
*.msm
*.msp
# JetBrains Rider
*.sln.iml
# ---> VisualStudioCode
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json
!.vscode/*.code-snippets
# Local History for Visual Studio Code
.history/
# Built Visual Studio Code Extensions
*.vsix
/.vs/DigitalData.Core/DesignTimeBuild/.dtbcache.v2
/.vs/DigitalData.Core/v17/.suo
/.vs/ProjectEvaluation/digitaldata.core.metadata.v6.1

View File

@@ -0,0 +1,23 @@
namespace DigitalData.Core.Abstractions.Security.Common;
/// <summary>
/// Represents a unique security context that identifies an issuer and an audience.
/// </summary>
public interface IUniqueSecurityContext
{
/// <summary>
/// Gets the issuer identifier for this security context.
/// </summary>
/// <remarks>
/// The issuer typically represents the entity that issues a token or a cryptographic key.
/// </remarks>
string Issuer { get; }
/// <summary>
/// Gets the audience identifier for this security context.
/// </summary>
/// <remarks>
/// The audience typically represents the intended recipient or target of a token or cryptographic operation.
/// </remarks>
string Audience { get; }
}

View File

@@ -0,0 +1,33 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>net7.0;net8.0</TargetFrameworks>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<PackageId>DigitalData.Core.Abstractions.Security</PackageId>
<Version>1.0.0</Version>
<AssemblyVersion>1.0.0</AssemblyVersion>
<FileVersion>1.0.0</FileVersion>
<Authors>Digital Data GmbH</Authors>
<Company>Digital Data GmbH</Company>
<Product>Digital Data GmbH</Product>
<Copyright>Copyright 2025</Copyright>
<PackageProjectUrl>http://git.dd:3000/AppStd/WebCoreModules.git</PackageProjectUrl>
<PackageIcon>core_icon.png</PackageIcon>
<Description>This package defines the foundational abstractions for implementing security functionalities within the DigitalData.Core ecosystem. It provides interfaces and base classes for encryption, decryption, and secure authentication mechanisms. Designed to ensure flexibility and consistency, it enables seamless integration with various security implementations, such as RSA-based encryption and JWT handling.</Description>
<PackageTags>digital data core security abstractions</PackageTags>
<RepositoryUrl>http://git.dd:3000/AppStd/WebCoreModules.git</RepositoryUrl>
</PropertyGroup>
<ItemGroup>
<None Include="..\..\nuget-package-icons\core_icon.png">
<Pack>True</Pack>
<PackagePath>\</PackagePath>
</None>
</ItemGroup>
<ItemGroup>
<PackageReference Include="System.IdentityModel.Tokens.Jwt" Version="7.7.1" />
</ItemGroup>
</Project>

View File

@@ -0,0 +1,64 @@
using DigitalData.Core.Abstractions.Security.Common;
using DigitalData.Core.Abstractions.Security.Key;
using DigitalData.Core.Abstractions.Security.Services;
using Microsoft.IdentityModel.Tokens;
using System.Text;
namespace DigitalData.Core.Abstractions.Security.Extensions;
public static class SecurityExtensions
{
#region Unique Security Context
public static IEnumerable<TUniqueSecurityContext> GetByIssuer<TUniqueSecurityContext>(this IEnumerable<TUniqueSecurityContext> contextes, string issuer) where TUniqueSecurityContext : IUniqueSecurityContext
=> contextes.Where(c => c.Issuer == issuer);
public static IEnumerable<TUniqueSecurityContext> GetByAudience<TUniqueSecurityContext>(this IEnumerable<TUniqueSecurityContext> contextes, string audience) where TUniqueSecurityContext : IUniqueSecurityContext
=> contextes.Where(c => c.Audience == audience);
public static TUniqueSecurityContext Get<TUniqueSecurityContext>(this IEnumerable<TUniqueSecurityContext> contextes, string issuer, string audience) where TUniqueSecurityContext : IUniqueSecurityContext
=> contextes.Where(c => c.Issuer == issuer && c.Audience == audience).SingleOrDefault()
?? throw new InvalidOperationException($"Exactly one {typeof(TUniqueSecurityContext).Name} must exist with Issuer: '{issuer}' and Audience: '{audience}'.");
public static bool TryGet<TUniqueSecurityContext>(this IEnumerable<TUniqueSecurityContext> contextes, string issuer, string audience, out TUniqueSecurityContext context) where TUniqueSecurityContext : IUniqueSecurityContext
{
#pragma warning disable CS8601 // Possible null reference assignment.
context = contextes.SingleOrDefault(c => c.Issuer == issuer && c.Audience == audience);
#pragma warning restore CS8601 // Possible null reference assignment.
return context is not null;
}
public static TUniqueSecurityContext Match<TUniqueSecurityContext>(this IEnumerable<TUniqueSecurityContext> contextes, IUniqueSecurityContext lookupContext) where TUniqueSecurityContext : IUniqueSecurityContext
=> contextes.Get(lookupContext.Issuer, lookupContext.Audience);
public static bool TryMatch<TUniqueSecurityContext>(this IEnumerable<TUniqueSecurityContext> contextes, IUniqueSecurityContext lookupContext, out TUniqueSecurityContext context) where TUniqueSecurityContext : IUniqueSecurityContext
=> contextes.TryGet(lookupContext.Issuer, lookupContext.Audience, out context);
#endregion Unique Security Context
#region De/serilization
internal static byte[] Base64ToByte(this string base64String) => Convert.FromBase64String(base64String);
internal static string BytesToString(this byte[] bytes) => Encoding.UTF8.GetString(bytes);
internal static string ToBase64String(this byte[] bytes) => Convert.ToBase64String(bytes);
internal static byte[] ToBytes(this string str) => Encoding.UTF8.GetBytes(str);
public static string Decrypt(this IAsymmetricDecryptor decryptor, string data) => decryptor
.Decrypt(data.Base64ToByte()).BytesToString();
#endregion De/serilization
#region Asymmetric Encryptor
public static string Encrypt(this IAsymmetricEncryptor encryptor, string data) => encryptor.Encrypt(data.ToBytes()).ToBase64String();
#endregion Asymmetric Encryptor
#region Jwt Signature Handler
public static string WriteToken<TPrincipal>(this IJwtSignatureHandler<TPrincipal> handler, SecurityTokenDescriptor descriptor)
=> handler.WriteToken(handler.CreateToken(descriptor));
public static string WriteToken<TPrincipal>(this IJwtSignatureHandler<TPrincipal> handler, TPrincipal subject, IAsymmetricTokenDescriptor descriptor)
=> handler.WriteToken(handler.CreateToken(subject: subject, descriptor: descriptor));
public static string WriteToken<TPrincipal>(this IJwtSignatureHandler<TPrincipal> handler, TPrincipal subject, string issuer, string audience)
=> handler.WriteToken(handler.CreateToken(subject: subject, issuer: issuer, audience: audience));
#endregion Jwt Signature Handler
}

View File

@@ -0,0 +1,8 @@
namespace DigitalData.Core.Abstractions.Security.Key;
public interface IAsymmetricDecryptor : IAsymmetricPrivateKey
{
byte[] Decrypt(byte[] data);
IAsymmetricEncryptor Encryptor { get; }
}

View File

@@ -0,0 +1,6 @@
namespace DigitalData.Core.Abstractions.Security.Key;
public interface IAsymmetricEncryptor : IAsymmetricPublicKey
{
byte[] Encrypt(byte[] data);
}

View File

@@ -0,0 +1,8 @@
namespace DigitalData.Core.Abstractions.Security.Key;
public interface IAsymmetricKey
{
string? Id { get; }
string Content { get; }
}

View File

@@ -0,0 +1,8 @@
namespace DigitalData.Core.Abstractions.Security.Key;
public interface IAsymmetricPrivateKey : IAsymmetricKey
{
bool IsEncrypted { get; }
IAsymmetricPublicKey PublicKey { get; }
}

View File

@@ -0,0 +1,5 @@
namespace DigitalData.Core.Abstractions.Security.Key;
public interface IAsymmetricPublicKey : IAsymmetricKey
{
}

View File

@@ -0,0 +1,74 @@
using DigitalData.Core.Abstractions.Security.Common;
using Microsoft.IdentityModel.Tokens;
namespace DigitalData.Core.Abstractions.Security.Key;
/// <summary>
/// Contains some information which used to create a security token. Designed to abstract <see cref="SecurityTokenDescriptor"/>
/// </summary>
public interface IAsymmetricTokenDescriptor : IAsymmetricPrivateKey, IUniqueSecurityContext
{
IAsymmetricTokenValidator Validator { get; }
TimeSpan Lifetime { get; init; }
#region SecurityTokenDescriptor Map
/// <summary>
/// Defines the compression algorithm that will be used to compress the JWT token payload.
/// </summary>
string CompressionAlgorithm { get; }
/// <summary>
/// Gets or sets the <see cref="EncryptingCredentials"/> used to create a encrypted security token.
/// </summary>
EncryptingCredentials EncryptingCredentials { get; }
/// <summary>
/// Gets or sets the value of the 'expiration' claim. This value should be in UTC.
/// </summary>
DateTime? Expires { get; }
/// <summary>
/// Gets or sets the time the security token was issued. This value should be in UTC.
/// </summary>
DateTime? IssuedAt { get; }
/// <summary>
/// Gets or sets the notbefore time for the security token. This value should be in UTC.
/// </summary>
DateTime? NotBefore { get; }
/// <summary>
/// Gets or sets the token type.
/// <remarks> If provided, this will be added as the value for the 'typ' header parameter. In the case of a JWE, this will be added to both the inner (JWS) and the outer token (JWE) header. By default, the value used is 'JWT'.
/// If <see cref="AdditionalHeaderClaims"/> also contains 'typ' header claim value, it will override the TokenType provided here.
/// This value is used only for JWT tokens and not for SAML/SAML2 tokens</remarks>
/// </summary>
string TokenType { get; }
/// <summary>
/// Gets or sets the <see cref="Dictionary{TKey, TValue}"/> which contains any custom header claims that need to be added to the JWT token header.
/// The 'alg', 'kid', 'x5t', 'enc', and 'zip' claims are added by default based on the <see cref="SigningCredentials"/>,
/// <see cref="EncryptingCredentials"/>, and/or <see cref="CompressionAlgorithm"/> provided and SHOULD NOT be included in this dictionary as this
/// will result in an exception being thrown.
/// <remarks> These claims are only added to the outer header (in case of a JWE).</remarks>
/// </summary>
IDictionary<string, object> AdditionalHeaderClaims { get; }
/// <summary>
/// Gets or sets the <see cref="Dictionary{TKey, TValue}"/> which contains any custom header claims that need to be added to the inner JWT token header.
/// The 'alg', 'kid', 'x5t', 'enc', and 'zip' claims are added by default based on the <see cref="SigningCredentials"/>,
/// <see cref="EncryptingCredentials"/>, and/or <see cref="CompressionAlgorithm"/> provided and SHOULD NOT be included in this dictionary as this
/// will result in an exception being thrown.
/// <remarks>
/// For JsonWebTokenHandler, these claims are merged with <see cref="AdditionalHeaderClaims"/> while adding to the inner JWT header.
/// </remarks>
/// </summary>
IDictionary<string, object> AdditionalInnerHeaderClaims { get; }
/// <summary>
/// Gets or sets the <see cref="SigningCredentials"/> used to create a security token.
/// </summary>
SigningCredentials SigningCredentials { get; }
#endregion SecurityTokenDescriptor
}

View File

@@ -0,0 +1,8 @@
using Microsoft.IdentityModel.Tokens;
namespace DigitalData.Core.Abstractions.Security.Key;
public interface IAsymmetricTokenValidator : IAsymmetricPublicKey
{
SecurityKey SecurityKey { get; }
}

View File

@@ -0,0 +1,23 @@
using System.Security.Cryptography;
using DigitalData.Core.Abstractions.Security.Key;
namespace DigitalData.Core.Abstractions.Security.Services;
public interface IAsymmetricKeyFactory
{
string CreatePrivateKeyPem(int? keySizeInBits = null, bool encrypt = false);
string CreateEncryptedPrivateKeyPem(
PbeEncryptionAlgorithm? pbeEncryptionAlgorithm = null,
HashAlgorithmName? hashAlgorithmName = null,
int? iterationCount = null,
int? keySizeInBits = null,
string? password = null);
string CreateEncryptedPrivateKeyPem(
PbeParameters pbeParameters,
int? keySizeInBits = null,
string? password = null);
IAsymmetricDecryptor CreateDecryptor(string pem, string? issuer = null, string? audience = null, bool encrypt = false, RSAEncryptionPadding? padding = null);
}

View File

@@ -0,0 +1,12 @@
using DigitalData.Core.Abstractions.Security.Key;
namespace DigitalData.Core.Abstractions.Security.Services;
public interface IAsymmetricKeyPool : IAsymmetricKeyFactory
{
IEnumerable<IAsymmetricDecryptor> Decryptors { get; }
IAsymmetricDecryptor VaultDecryptor { get; }
IEnumerable<IAsymmetricTokenDescriptor> TokenDescriptors { get; }
}

View File

@@ -1,6 +1,7 @@
using Microsoft.IdentityModel.Tokens;
using DigitalData.Core.Abstractions.Security.Key;
using Microsoft.IdentityModel.Tokens;
namespace DigitalData.Core.Abstractions.Security
namespace DigitalData.Core.Abstractions.Security.Services
{
public interface IJwtSignatureHandler<TPrincipal>
{

View File

@@ -13,14 +13,82 @@ namespace DigitalData.Core.Abstractions.Application
Dictionary<string, string> CustomSearchFilters { get; }
bool ValidateCredentials(string dirEntryUsername, string dirEntryPassword);
/// <summary>
/// Creates the connections to the server and returns a Boolean value that specifies
/// whether the specified username and password are valid.
/// </summary>
/// <param name="userName">The username that is validated on the server. See the Remarks section
/// for more information on the format of userName.</param>
/// <param name="password">The password that is validated on the server.</param>
/// <returns>True if the credentials are valid; otherwise, false.</returns>
bool ValidateCredentials(string userName, string password);
/// <summary>
/// Creates the connections to the server asynchronously and returns a Boolean value that specifies
/// whether the specified username and password are valid.
/// </summary>
/// <param name="userName">The username that is validated on the server. See the Remarks section
/// for more information on the format of userName.</param>
/// <param name="password">The password that is validated on the server.</param>
/// <returns>True if the credentials are valid; otherwise, false.</returns>
Task<bool> ValidateCredentialsAsync(string userName, string password);
/// <summary>
/// Finds all directory entries matching the specified filter.
/// </summary>
/// <param name="searchRoot">The search root.</param>
/// <param name="filter">The search filter.</param>
/// <param name="searchScope">The search scope.</param>
/// <param name="sizeLimit">The size limit.</param>
/// <param name="properties">The properties to load.</param>
/// <returns>A <see cref="DataResult{T}"/> containing the results.</returns>
DataResult<IEnumerable<ResultPropertyCollection>> FindAll(DirectoryEntry searchRoot, string filter, SearchScope searchScope = SearchScope.Subtree, int sizeLimit = 5000, params string[] properties);
/// <summary>
/// Finds all directory entries matching the specified filter asynchronously.
/// </summary>
/// <param name="searchRoot">The search root.</param>
/// <param name="filter">The search filter.</param>
/// <param name="searchScope">The search scope.</param>
/// <param name="sizeLimit">The size limit.</param>
/// <param name="properties">The properties to load.</param>
/// <returns>A <see cref="DataResult{T}"/> containing the results.</returns>
Task<DataResult<IEnumerable<ResultPropertyCollection>>> FindAllAsync(DirectoryEntry searchRoot, string filter, SearchScope searchScope = SearchScope.Subtree, int sizeLimit = 5000, params string[] properties);
/// <summary>
/// Finds all directory entries matching the specified filter, using the user cache.
/// </summary>
/// <param name="username">The username.</param>
/// <param name="filter">The search filter.</param>
/// <param name="searchScope">The search scope.</param>
/// <param name="sizeLimit">The size limit.</param>
/// <param name="properties">The properties to load.</param>
/// <returns>A <see cref="DataResult{T}"/> containing the results.</returns>
DataResult<IEnumerable<ResultPropertyCollection>> FindAllByUserCache(string username, string filter, SearchScope searchScope = SearchScope.Subtree, int sizeLimit = 5000, params string[] properties);
/// <summary>
/// Finds all directory entries matching the specified filter asynchronously, using the user cache.
/// </summary>
/// <param name="username">The username.</param>
/// <param name="filter">The search filter.</param>
/// <param name="searchScope">The search scope.</param>
/// <param name="sizeLimit">The size limit.</param>
/// <param name="properties">The properties to load.</param>
/// <returns>A <see cref="DataResult{T}"/> containing the results.</returns>
Task<DataResult<IEnumerable<ResultPropertyCollection>>> FindAllByUserCacheAsync(string username, string filter, SearchScope searchScope = SearchScope.Subtree, int sizeLimit = 5000, params string[] properties);
/// <summary>
/// Sets the search root in the cache.
/// </summary>
/// <param name="username">The directory entry username.</param>
/// <param name="password">The directory entry password.</param>
void SetSearchRootCache(string username, string password);
/// <summary>
/// Gets the search root from the cache.
/// </summary>
/// <param name="username">The directory entry username.</param>
/// <returns>The cached <see cref="DirectoryEntry"/> if found; otherwise, null.</returns>
DirectoryEntry? GetSearchRootCache(string username);
}
}

View File

@@ -17,9 +17,9 @@
<RepositoryUrl>http://git.dd:3000/AppStd/WebCoreModules.git</RepositoryUrl>
<PackAsTool>False</PackAsTool>
<PackageIcon>core_icon.png</PackageIcon>
<Version>3.1.0</Version>
<AssemblyVersion>3.1.0</AssemblyVersion>
<FileVersion>3.1.0</FileVersion>
<Version>3.4.0</Version>
<AssemblyVersion>3.4.0</AssemblyVersion>
<FileVersion>3.4.0</FileVersion>
</PropertyGroup>
<ItemGroup>

View File

@@ -1,9 +0,0 @@
namespace DigitalData.Core.Abstractions.Security
{
public interface IAsymmetricDecryptor : IAsymmetricPrivateKey
{
byte[] Decrypt(byte[] data);
IAsymmetricEncryptor Encryptor { get; }
}
}

View File

@@ -1,7 +0,0 @@
namespace DigitalData.Core.Abstractions.Security
{
public interface IAsymmetricEncryptor : IAsymmetricPublicKey
{
byte[] Encrypt(byte[] data);
}
}

View File

@@ -1,9 +0,0 @@
namespace DigitalData.Core.Abstractions.Security
{
public interface IAsymmetricKey
{
string? Id { get; }
string Content { get; }
}
}

View File

@@ -1,23 +0,0 @@
using System.Security.Cryptography;
namespace DigitalData.Core.Abstractions.Security
{
public interface IAsymmetricKeyFactory
{
string CreatePrivateKeyPem(int? keySizeInBits = null, bool encrypt = false);
string CreateEncryptedPrivateKeyPem(
PbeEncryptionAlgorithm? pbeEncryptionAlgorithm = null,
HashAlgorithmName? hashAlgorithmName = null,
int? iterationCount = null,
int? keySizeInBits = null,
string? password = null);
string CreateEncryptedPrivateKeyPem(
PbeParameters pbeParameters,
int? keySizeInBits = null,
string? password = null);
IAsymmetricDecryptor CreateDecryptor(string pem, string? issuer = null, string? audience = null, bool encrypt = false, RSAEncryptionPadding? padding = null);
}
}

View File

@@ -1,9 +0,0 @@
namespace DigitalData.Core.Abstractions.Security
{
public interface IAsymmetricPrivateKey : IAsymmetricKey
{
bool IsEncrypted { get; }
IAsymmetricPublicKey PublicKey { get; }
}
}

View File

@@ -1,6 +0,0 @@
namespace DigitalData.Core.Abstractions.Security
{
public interface IAsymmetricPublicKey : IAsymmetricKey
{
}
}

View File

@@ -1,74 +0,0 @@
using Microsoft.IdentityModel.Tokens;
namespace DigitalData.Core.Abstractions.Security
{
/// <summary>
/// Contains some information which used to create a security token. Designed to abstract <see cref="SecurityTokenDescriptor"/>
/// </summary>
public interface IAsymmetricTokenDescriptor : IAsymmetricPrivateKey, IUniqueSecurityContext
{
IAsymmetricTokenValidator Validator { get; }
TimeSpan Lifetime { get; init; }
#region SecurityTokenDescriptor Map
/// <summary>
/// Defines the compression algorithm that will be used to compress the JWT token payload.
/// </summary>
string CompressionAlgorithm { get; }
/// <summary>
/// Gets or sets the <see cref="EncryptingCredentials"/> used to create a encrypted security token.
/// </summary>
EncryptingCredentials EncryptingCredentials { get; }
/// <summary>
/// Gets or sets the value of the 'expiration' claim. This value should be in UTC.
/// </summary>
DateTime? Expires { get; }
/// <summary>
/// Gets or sets the time the security token was issued. This value should be in UTC.
/// </summary>
DateTime? IssuedAt { get; }
/// <summary>
/// Gets or sets the notbefore time for the security token. This value should be in UTC.
/// </summary>
DateTime? NotBefore { get; }
/// <summary>
/// Gets or sets the token type.
/// <remarks> If provided, this will be added as the value for the 'typ' header parameter. In the case of a JWE, this will be added to both the inner (JWS) and the outer token (JWE) header. By default, the value used is 'JWT'.
/// If <see cref="AdditionalHeaderClaims"/> also contains 'typ' header claim value, it will override the TokenType provided here.
/// This value is used only for JWT tokens and not for SAML/SAML2 tokens</remarks>
/// </summary>
string TokenType { get; }
/// <summary>
/// Gets or sets the <see cref="Dictionary{TKey, TValue}"/> which contains any custom header claims that need to be added to the JWT token header.
/// The 'alg', 'kid', 'x5t', 'enc', and 'zip' claims are added by default based on the <see cref="SigningCredentials"/>,
/// <see cref="EncryptingCredentials"/>, and/or <see cref="CompressionAlgorithm"/> provided and SHOULD NOT be included in this dictionary as this
/// will result in an exception being thrown.
/// <remarks> These claims are only added to the outer header (in case of a JWE).</remarks>
/// </summary>
IDictionary<string, object> AdditionalHeaderClaims { get; }
/// <summary>
/// Gets or sets the <see cref="Dictionary{TKey, TValue}"/> which contains any custom header claims that need to be added to the inner JWT token header.
/// The 'alg', 'kid', 'x5t', 'enc', and 'zip' claims are added by default based on the <see cref="SigningCredentials"/>,
/// <see cref="EncryptingCredentials"/>, and/or <see cref="CompressionAlgorithm"/> provided and SHOULD NOT be included in this dictionary as this
/// will result in an exception being thrown.
/// <remarks>
/// For JsonWebTokenHandler, these claims are merged with <see cref="AdditionalHeaderClaims"/> while adding to the inner JWT header.
/// </remarks>
/// </summary>
IDictionary<string, object> AdditionalInnerHeaderClaims { get; }
/// <summary>
/// Gets or sets the <see cref="SigningCredentials"/> used to create a security token.
/// </summary>
SigningCredentials SigningCredentials { get; }
#endregion SecurityTokenDescriptor
}
}

View File

@@ -1,9 +0,0 @@
using Microsoft.IdentityModel.Tokens;
namespace DigitalData.Core.Abstractions.Security
{
public interface IAsymmetricTokenValidator : IAsymmetricPublicKey
{
SecurityKey SecurityKey { get; }
}
}

View File

@@ -1,11 +0,0 @@
namespace DigitalData.Core.Abstractions.Security
{
public interface ICryptoFactory : IAsymmetricKeyFactory
{
IEnumerable<IAsymmetricDecryptor> Decryptors { get; }
IAsymmetricDecryptor VaultDecryptor { get; }
IEnumerable<IAsymmetricTokenDescriptor> TokenDescriptors { get; }
}
}

View File

@@ -1,24 +0,0 @@
namespace DigitalData.Core.Abstractions.Security
{
/// <summary>
/// Represents a unique security context that identifies an issuer and an audience.
/// </summary>
public interface IUniqueSecurityContext
{
/// <summary>
/// Gets the issuer identifier for this security context.
/// </summary>
/// <remarks>
/// The issuer typically represents the entity that issues a token or a cryptographic key.
/// </remarks>
string Issuer { get; }
/// <summary>
/// Gets the audience identifier for this security context.
/// </summary>
/// <remarks>
/// The audience typically represents the intended recipient or target of a token or cryptographic operation.
/// </remarks>
string Audience { get; }
}
}

View File

@@ -1,62 +0,0 @@
using Microsoft.IdentityModel.Tokens;
using System.Text;
namespace DigitalData.Core.Abstractions.Security
{
public static class SecurityExtensions
{
#region Unique Security Context
public static IEnumerable<TUniqueSecurityContext> GetByIssuer<TUniqueSecurityContext>(this IEnumerable<TUniqueSecurityContext> contextes, string issuer) where TUniqueSecurityContext: IUniqueSecurityContext
=> contextes.Where(c => c.Issuer == issuer);
public static IEnumerable<TUniqueSecurityContext> GetByAudience<TUniqueSecurityContext>(this IEnumerable<TUniqueSecurityContext> contextes, string audience) where TUniqueSecurityContext : IUniqueSecurityContext
=> contextes.Where(c => c.Audience == audience);
public static TUniqueSecurityContext Get<TUniqueSecurityContext>(this IEnumerable<TUniqueSecurityContext> contextes, string issuer, string audience) where TUniqueSecurityContext : IUniqueSecurityContext
=> contextes.Where(c => c.Issuer == issuer && c.Audience == audience).SingleOrDefault()
?? throw new InvalidOperationException($"Exactly one {typeof(TUniqueSecurityContext).Name} must exist with Issuer: '{issuer}' and Audience: '{audience}'.");
public static bool TryGet<TUniqueSecurityContext>(this IEnumerable<TUniqueSecurityContext> contextes, string issuer, string audience, out TUniqueSecurityContext context) where TUniqueSecurityContext : IUniqueSecurityContext
{
#pragma warning disable CS8601 // Possible null reference assignment.
context = contextes.SingleOrDefault(c => c.Issuer == issuer && c.Audience == audience);
#pragma warning restore CS8601 // Possible null reference assignment.
return context is not null;
}
public static TUniqueSecurityContext Match<TUniqueSecurityContext>(this IEnumerable<TUniqueSecurityContext> contextes, IUniqueSecurityContext lookupContext) where TUniqueSecurityContext : IUniqueSecurityContext
=> contextes.Get(lookupContext.Issuer, lookupContext.Audience);
public static bool TryMatch<TUniqueSecurityContext>(this IEnumerable<TUniqueSecurityContext> contextes, IUniqueSecurityContext lookupContext, out TUniqueSecurityContext context) where TUniqueSecurityContext : IUniqueSecurityContext
=> contextes.TryGet(lookupContext.Issuer, lookupContext.Audience, out context);
#endregion Unique Security Context
#region De/serilization
internal static byte[] Base64ToByte(this string base64String) => Convert.FromBase64String(base64String);
internal static string BytesToString(this byte[] bytes) => Encoding.UTF8.GetString(bytes);
internal static string ToBase64String(this byte[] bytes) => Convert.ToBase64String(bytes);
internal static byte[] ToBytes(this string str) => System.Text.Encoding.UTF8.GetBytes(str);
public static string Decrypt(this IAsymmetricDecryptor decryptor, string data) => decryptor
.Decrypt(data.Base64ToByte()).BytesToString();
#endregion De/serilization
#region Asymmetric Encryptor
public static string Encrypt(this IAsymmetricEncryptor encryptor, string data) => encryptor.Encrypt(data.ToBytes()).ToBase64String();
#endregion Asymmetric Encryptor
#region Jwt Signature Handler
public static string WriteToken<TPrincipal>(this IJwtSignatureHandler<TPrincipal> handler, SecurityTokenDescriptor descriptor)
=> handler.WriteToken(handler.CreateToken(descriptor));
public static string WriteToken<TPrincipal>(this IJwtSignatureHandler<TPrincipal> handler, TPrincipal subject, IAsymmetricTokenDescriptor descriptor)
=> handler.WriteToken(handler.CreateToken(subject: subject, descriptor: descriptor));
public static string WriteToken<TPrincipal>(this IJwtSignatureHandler<TPrincipal> handler, TPrincipal subject, string issuer, string audience)
=> handler.WriteToken(handler.CreateToken(subject: subject, issuer: issuer, audience: audience));
#endregion Jwt Signature Handler
}
}

View File

@@ -0,0 +1,13 @@
namespace DigitalData.Core.Abstractions
{
public static class ServiceResultExtensions
{
public static bool Try<T>(this T? nullableResult, out T result)
{
#pragma warning disable CS8601 // Possible null reference assignment.
result = nullableResult;
#pragma warning restore CS8601 // Possible null reference assignment.
return nullableResult is not null;
}
}
}

View File

@@ -1,7 +1,5 @@
using AutoMapper;
using DigitalData.Core.Abstractions;
using DigitalData.Core.Abstractions.Application;
using DigitalData.Core.Abstractions.Infrastructure;
using DigitalData.Core.Abstractions.Application;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using Microsoft.IdentityModel.Tokens;
@@ -13,50 +11,6 @@ namespace DigitalData.Core.Application
/// </summary>
public static class DIExtensions
{
/// <summary>
/// Adds a basic CRUD service for a specific DTO and entity type to the service collection.
/// </summary>
/// <typeparam name="TDto">The DTO type the service operates on.</typeparam>
/// <typeparam name="TEntity">The entity type corresponding to the DTO.</typeparam>
/// <typeparam name="TId">The type of the entity's identifier.</typeparam>
/// <typeparam name="TProfile">The AutoMapper profile type for configuring mappings between the DTO and the entity.</typeparam>
/// <param name="services">The <see cref="IServiceCollection"/> to add the service to.</param>
/// <param name="configureService">An optional action to configure additional services for the CRUD service.</param>
/// <returns>The original <see cref="IServiceCollection"/> instance, allowing further configuration.</returns>
public static IServiceCollection AddCleanBasicCRUDService<TCRUDRepository, TDto, TEntity, TId, TProfile>(this IServiceCollection services, Action<IServiceCollection>? configureService = null)
where TCRUDRepository : ICRUDRepository<TEntity, TId> where TDto : class, IUnique<TId> where TEntity : class, IUnique<TId> where TProfile : Profile
{
services.AddScoped<IBasicCRUDService<TDto, TEntity, TId>, BasicCRUDService<TCRUDRepository, TDto, TEntity, TId>>();
configureService?.Invoke(services);
services.AddAutoMapper(typeof(TProfile).Assembly);
return services;
}
/// <summary>
/// Adds a CRUD service for managing create, read, update, and delete operations for a specific set of DTOs and an entity type to the service collection.
/// </summary>
/// <typeparam name="TCRUDRepository">The repository type that provides CRUD operations for entities of type TEntity.</typeparam>
/// <typeparam name="TCreateDto">The DTO type used for create operations.</typeparam>
/// <typeparam name="TReadDto">The DTO type used for read operations.</typeparam>
/// <typeparam name="TEntity">The entity type corresponding to the DTOs.</typeparam>
/// <typeparam name="TId">The type of the entity's identifier.</typeparam>
/// <typeparam name="TProfile">The AutoMapper profile type for configuring mappings between the DTOs and the entity.</typeparam>
/// <param name="services">The <see cref="IServiceCollection"/> to add the service to.</param>
/// <param name="configureService">An optional action to configure additional services for the CRUD service.</param>
/// <returns>The original <see cref="IServiceCollection"/> instance, allowing further configuration.</returns>
public static IServiceCollection AddCleanCRUDService<TCRUDRepository, TCreateDto, TReadDto, TUpdateDto, TEntity, TId, TProfile>(this IServiceCollection services, Action<IServiceCollection>? configureService = null)
where TCRUDRepository : ICRUDRepository<TEntity, TId> where TCreateDto : class where TReadDto : class, IUnique<TId> where TEntity : class, IUnique<TId> where TProfile : Profile
{
services.AddScoped<ICRUDService<TCreateDto, TReadDto, TEntity, TId>, CRUDService<TCRUDRepository, TCreateDto, TReadDto, TEntity, TId>>();
configureService?.Invoke(services);
services.AddAutoMapper(typeof(TProfile).Assembly);
return services;
}
/// <summary>
/// Adds the directory search service to the <see cref="IServiceCollection"/>.
/// </summary>
@@ -71,12 +25,9 @@ namespace DigitalData.Core.Application
/// If <paramref name="directorySearchOptions"/> is not provided, ensure to configure the options separately
/// using the <see cref="IOptions{TOptions}"/> pattern.
/// </remarks>
public static IServiceCollection AddDirectorySearchService(this IServiceCollection service, DirectorySearchOptions? directorySearchOptions = null)
public static IServiceCollection AddDirectorySearchService(this IServiceCollection service, IConfigurationSection directorySearchOptions)
{
if(directorySearchOptions is not null)
service.AddSingleton(Options.Create(directorySearchOptions));
return service
return service.Configure<DirectorySearchOptions>(directorySearchOptions)
.AddMemoryCache()
.AddScoped<IDirectorySearchService, DirectorySearchService>();
}

View File

@@ -14,9 +14,9 @@
<PackageIcon>core_icon.png</PackageIcon>
<RepositoryUrl>http://git.dd:3000/AppStd/WebCoreModules.git</RepositoryUrl>
<PackageTags>digital data core application clean architecture</PackageTags>
<Version>3.0.1</Version>
<AssemblyVersion>3.0.1</AssemblyVersion>
<FileVersion>3.0.1</FileVersion>
<Version>3.2.0</Version>
<AssemblyVersion>3.2.0</AssemblyVersion>
<FileVersion>3.2.0</FileVersion>
</PropertyGroup>
<ItemGroup>
@@ -32,6 +32,7 @@
<PackageReference Include="Microsoft.Extensions.Configuration" Version="7.0.0" />
<PackageReference Include="Microsoft.Extensions.Localization.Abstractions" Version="7.0.16" />
<PackageReference Include="Microsoft.Extensions.Logging" Version="7.0.0" />
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="7.0.0" />
<PackageReference Include="System.DirectoryServices.AccountManagement" Version="7.0.1" />
<PackageReference Include="System.IdentityModel.Tokens.Jwt" Version="7.5.1" />
<PackageReference Include="System.Security.Cryptography.Cng" Version="5.0.0" />

View File

@@ -5,21 +5,24 @@
/// </summary>
public class DirectorySearchOptions
{
//TODO: Merge with Root and rename as path
/// <summary>
/// Gets or initializes the name of the server to be used in the directory search.
/// </summary>
public string? ServerName { get; init; }
public required string ServerName { get; init; }
/// <summary>
/// Gets or initializes the root directory path for the search.
/// </summary>
public string? Root { get; init; }
public required string Root { get; init; }
//TODO: Convert to timespan
/// <summary>
/// Gets or initializes the number of days before the user cache expires.
/// </summary>
public int UserCacheExpirationDays { get; init; }
public double? UserCacheExpirationDays { get; init; }
//TODO: Rename as CustomSearchFilters
/// <summary>
/// Gets or initializes the custom search filters to be applied during directory searches.
/// </summary>

View File

@@ -8,6 +8,7 @@ using Microsoft.Extensions.Options;
namespace DigitalData.Core.Application
{
//TODO: rename as DirectorySearcher
[SuppressMessage("Interoperability", "CA1416:Validate platform compatibility", Justification = "<Pending>")]
public class DirectorySearchService : IDirectorySearchService
{
@@ -15,7 +16,7 @@ namespace DigitalData.Core.Application
public string ServerName { get; }
public string Root { get; }
public string SearchRootPath { get; }
private readonly DateTimeOffset _userCacheExpiration;
private readonly DateTimeOffset? _userCacheExpiration;
public Dictionary<string, string> CustomSearchFilters { get; }
/// <summary>
@@ -32,33 +33,44 @@ namespace DigitalData.Core.Application
var dirSearchOptions = options.Value;
ServerName = dirSearchOptions.ServerName ?? throw new InvalidOperationException("The server name for directory search is not configured. Please specify the 'DirectorySearch:ServerName' in the configuration.");
ServerName = dirSearchOptions.ServerName;
Root = dirSearchOptions.Root ?? throw new InvalidOperationException("The root for directory search is not configured. Please specify the 'DirectorySearch:Root' in the configuration.");
Root = dirSearchOptions.Root;
SearchRootPath = $"LDAP://{ServerName}/{Root}";
CustomSearchFilters = dirSearchOptions.CustomSearchFilters;
var dayCounts = dirSearchOptions.UserCacheExpirationDays;
if (dayCounts == default)
_userCacheExpiration = default;
else
_userCacheExpiration = DateTimeOffset.Now.Date.AddDays(dayCounts);
if(dirSearchOptions.UserCacheExpirationDays is double expirationDays)
_userCacheExpiration = DateTimeOffset.Now.Date.AddDays(expirationDays);
}
/// <summary>
/// Validates the credentials of a directory entry.
/// Creates the connections to the server and returns a Boolean value that specifies
/// whether the specified username and password are valid.
/// </summary>
/// <param name="dirEntryUsername">The directory entry username.</param>
/// <param name="dirEntryPassword">The directory entry password.</param>
/// <param name="userName">The username that is validated on the server. See the Remarks section
/// for more information on the format of userName.</param>
/// <param name="password">The password that is validated on the server.</param>
/// <returns>True if the credentials are valid; otherwise, false.</returns>
public bool ValidateCredentials(string dirEntryUsername, string dirEntryPassword)
public bool ValidateCredentials(string userName, string password)
{
using var context = new PrincipalContext(ContextType.Domain, ServerName, Root);
return context.ValidateCredentials(dirEntryUsername, dirEntryPassword);
return context.ValidateCredentials(userName, password);
}
/// <summary>
/// Creates the connections to the server asynchronously and returns a Boolean value that specifies
/// whether the specified username and password are valid.
/// </summary>
/// <param name="userName">The username that is validated on the server. See the Remarks section
/// for more information on the format of userName.</param>
/// <param name="password">The password that is validated on the server.</param>
/// <returns>True if the credentials are valid; otherwise, false.</returns>
public Task<bool> ValidateCredentialsAsync(string userName, string password) => Task.Run(()
=> ValidateCredentials(userName, password));
//TODO: remove unnecessary DataResult
/// <summary>
/// Finds all directory entries matching the specified filter.
/// </summary>
@@ -72,7 +84,7 @@ namespace DigitalData.Core.Application
{
List<ResultPropertyCollection> list = new();
var searcher = new DirectorySearcher()
using var searcher = new DirectorySearcher()
{
Filter = filter,
SearchScope = searchScope,
@@ -97,6 +109,18 @@ namespace DigitalData.Core.Application
return Result.Success<IEnumerable<ResultPropertyCollection>>(list);
}
/// <summary>
/// Finds all directory entries matching the specified filter asynchronously.
/// </summary>
/// <param name="searchRoot">The search root.</param>
/// <param name="filter">The search filter.</param>
/// <param name="searchScope">The search scope.</param>
/// <param name="sizeLimit">The size limit.</param>
/// <param name="properties">The properties to load.</param>
/// <returns>A <see cref="DataResult{T}"/> containing the results.</returns>
public Task<DataResult<IEnumerable<ResultPropertyCollection>>> FindAllAsync(DirectoryEntry searchRoot, string filter, SearchScope searchScope = SearchScope.Subtree, int sizeLimit = 5000, params string[] properties) => Task.Run(()
=> FindAll(searchRoot, filter, searchScope, sizeLimit, properties));
/// <summary>
/// Finds all directory entries matching the specified filter, using the user cache.
/// </summary>
@@ -116,28 +140,39 @@ namespace DigitalData.Core.Application
return FindAll(searchRoot, filter, searchScope, sizeLimit, properties);
}
/// <summary>
/// Finds all directory entries matching the specified filter asynchronously, using the user cache.
/// </summary>
/// <param name="username">The username.</param>
/// <param name="filter">The search filter.</param>
/// <param name="searchScope">The search scope.</param>
/// <param name="sizeLimit">The size limit.</param>
/// <param name="properties">The properties to load.</param>
/// <returns>A <see cref="DataResult{T}"/> containing the results.</returns>
public Task<DataResult<IEnumerable<ResultPropertyCollection>>> FindAllByUserCacheAsync(string username, string filter, SearchScope searchScope = SearchScope.Subtree, int sizeLimit = 5000, params string[] properties) => Task.Run(()
=> FindAllByUserCache(username, filter, searchScope, sizeLimit, properties));
/// <summary>
/// Sets the search root in the cache.
/// </summary>
/// <param name="dirEntryUsername">The directory entry username.</param>
/// <param name="dirEntryPassword">The directory entry password.</param>
public void SetSearchRootCache(string dirEntryUsername, string dirEntryPassword)
/// <param name="username">The directory entry username.</param>
/// <param name="password">The directory entry password.</param>
public void SetSearchRootCache(string username, string password)
{
if (_userCacheExpiration == default)
_memoryCache.Set(key: dirEntryUsername, new DirectoryEntry(path: SearchRootPath, username: dirEntryUsername, password: dirEntryPassword));
if (_userCacheExpiration is DateTimeOffset cacheExpiration)
_memoryCache.Set(key: username, new DirectoryEntry(path: SearchRootPath, username: username, password: password), absoluteExpiration: cacheExpiration);
else
_memoryCache.Set(key: dirEntryUsername, new DirectoryEntry(path: SearchRootPath, username: dirEntryUsername, password: dirEntryPassword), absoluteExpiration: _userCacheExpiration);
_memoryCache.Set(key: username, new DirectoryEntry(path: SearchRootPath, username: username, password: password));
}
/// <summary>
/// Gets the search root from the cache.
/// </summary>
/// <param name="dirEntryUsername">The directory entry username.</param>
/// <param name="username">The directory entry username.</param>
/// <returns>The cached <see cref="DirectoryEntry"/> if found; otherwise, null.</returns>
public DirectoryEntry? GetSearchRootCache(string dirEntryUsername)
public DirectoryEntry? GetSearchRootCache(string username)
{
_memoryCache.TryGetValue(dirEntryUsername, out DirectoryEntry? root);
_memoryCache.TryGetValue(username, out DirectoryEntry? root);
return root;
}
}

View File

@@ -1,4 +0,0 @@
// <autogenerated />
using System;
using System.Reflection;
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v7.0", FrameworkDisplayName = ".NET 7.0")]

View File

@@ -1,8 +0,0 @@
// <auto-generated/>
global using global::System;
global using global::System.Collections.Generic;
global using global::System.IO;
global using global::System.Linq;
global using global::System.Net.Http;
global using global::System.Threading;
global using global::System.Threading.Tasks;

View File

@@ -1,23 +0,0 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
using System;
using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("DigitalData.Core.CleanArchitecture.Application")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")]
[assembly: System.Reflection.AssemblyProductAttribute("DigitalData.Core.CleanArchitecture.Application")]
[assembly: System.Reflection.AssemblyTitleAttribute("DigitalData.Core.CleanArchitecture.Application")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
// Generated by the MSBuild WriteCodeFragment class.

View File

@@ -1,11 +0,0 @@
is_global = true
build_property.TargetFramework = net7.0
build_property.TargetPlatformMinVersion =
build_property.UsingMicrosoftNETSdkWeb =
build_property.ProjectTypeGuids =
build_property.InvariantGlobalization =
build_property.PlatformNeutralAssembly =
build_property.EnforceExtendedAnalyzerRules =
build_property._SupportedPlatformList = Linux,macOS,Windows
build_property.RootNamespace = DigitalData.Core.CleanArchitecture.Application
build_property.ProjectDir = E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.CleanArchitecture.Application\

View File

@@ -1,8 +0,0 @@
// <auto-generated/>
global using global::System;
global using global::System.Collections.Generic;
global using global::System.IO;
global using global::System.Linq;
global using global::System.Net.Http;
global using global::System.Threading;
global using global::System.Threading.Tasks;

View File

@@ -1,34 +0,0 @@
E:\TekH\Visual Studio\DigitalData\DigitalData.Core\DigitalData.Core.CleanArchitecture.Application\obj\Debug\net7.0\DigitalData.Core.CleanArchitecture.Application.csproj.AssemblyReference.cache
E:\TekH\Visual Studio\DigitalData\DigitalData.Core\DigitalData.Core.CleanArchitecture.Application\obj\Debug\net7.0\DigitalData.Core.CleanArchitecture.Application.GeneratedMSBuildEditorConfig.editorconfig
E:\TekH\Visual Studio\DigitalData\DigitalData.Core\DigitalData.Core.CleanArchitecture.Application\obj\Debug\net7.0\DigitalData.Core.CleanArchitecture.Application.AssemblyInfoInputs.cache
E:\TekH\Visual Studio\DigitalData\DigitalData.Core\DigitalData.Core.CleanArchitecture.Application\obj\Debug\net7.0\DigitalData.Core.CleanArchitecture.Application.AssemblyInfo.cs
E:\TekH\Visual Studio\DigitalData\DigitalData.Core\DigitalData.Core.CleanArchitecture.Application\obj\Debug\net7.0\DigitalData.Core.CleanArchitecture.Application.csproj.CoreCompileInputs.cache
E:\TekH\Visual Studio\DigitalData\DigitalData.Core\DigitalData.Core.CleanArchitecture.Application\bin\Debug\net7.0\DigitalData.Core.CleanArchitecture.Application.deps.json
E:\TekH\Visual Studio\DigitalData\DigitalData.Core\DigitalData.Core.CleanArchitecture.Application\bin\Debug\net7.0\DigitalData.Core.CleanArchitecture.Application.dll
E:\TekH\Visual Studio\DigitalData\DigitalData.Core\DigitalData.Core.CleanArchitecture.Application\bin\Debug\net7.0\DigitalData.Core.CleanArchitecture.Application.pdb
E:\TekH\Visual Studio\DigitalData\DigitalData.Core\DigitalData.Core.CleanArchitecture.Application\bin\Debug\net7.0\DigitalData.Core.Contracts.dll
E:\TekH\Visual Studio\DigitalData\DigitalData.Core\DigitalData.Core.CleanArchitecture.Application\bin\Debug\net7.0\DigitalData.Core.Exceptions.dll
E:\TekH\Visual Studio\DigitalData\DigitalData.Core\DigitalData.Core.CleanArchitecture.Application\bin\Debug\net7.0\DigitalData.Core.Contracts.pdb
E:\TekH\Visual Studio\DigitalData\DigitalData.Core\DigitalData.Core.CleanArchitecture.Application\bin\Debug\net7.0\DigitalData.Core.Exceptions.pdb
E:\TekH\Visual Studio\DigitalData\DigitalData.Core\DigitalData.Core.CleanArchitecture.Application\obj\Debug\net7.0\DigitalData.Core.CleanArchitecture.Application.csproj.CopyComplete
E:\TekH\Visual Studio\DigitalData\DigitalData.Core\DigitalData.Core.CleanArchitecture.Application\obj\Debug\net7.0\DigitalData.Core.CleanArchitecture.Application.dll
E:\TekH\Visual Studio\DigitalData\DigitalData.Core\DigitalData.Core.CleanArchitecture.Application\obj\Debug\net7.0\refint\DigitalData.Core.CleanArchitecture.Application.dll
E:\TekH\Visual Studio\DigitalData\DigitalData.Core\DigitalData.Core.CleanArchitecture.Application\obj\Debug\net7.0\DigitalData.Core.CleanArchitecture.Application.pdb
E:\TekH\Visual Studio\DigitalData\DigitalData.Core\DigitalData.Core.CleanArchitecture.Application\obj\Debug\net7.0\ref\DigitalData.Core.CleanArchitecture.Application.dll
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.CleanArchitecture.Application\obj\Debug\net7.0\DigitalData.Core.CleanArchitecture.Application.csproj.AssemblyReference.cache
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.CleanArchitecture.Application\obj\Debug\net7.0\DigitalData.Core.CleanArchitecture.Application.GeneratedMSBuildEditorConfig.editorconfig
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.CleanArchitecture.Application\obj\Debug\net7.0\DigitalData.Core.CleanArchitecture.Application.AssemblyInfoInputs.cache
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.CleanArchitecture.Application\obj\Debug\net7.0\DigitalData.Core.CleanArchitecture.Application.AssemblyInfo.cs
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.CleanArchitecture.Application\obj\Debug\net7.0\DigitalData.Core.CleanArchitecture.Application.csproj.CoreCompileInputs.cache
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.CleanArchitecture.Application\obj\Debug\net7.0\DigitalData.Core.CleanArchitecture.Application.dll
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.CleanArchitecture.Application\obj\Debug\net7.0\refint\DigitalData.Core.CleanArchitecture.Application.dll
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.CleanArchitecture.Application\obj\Debug\net7.0\DigitalData.Core.CleanArchitecture.Application.pdb
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.CleanArchitecture.Application\bin\Debug\net7.0\DigitalData.Core.CleanArchitecture.Application.deps.json
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.CleanArchitecture.Application\bin\Debug\net7.0\DigitalData.Core.CleanArchitecture.Application.dll
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.CleanArchitecture.Application\bin\Debug\net7.0\DigitalData.Core.CleanArchitecture.Application.pdb
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.CleanArchitecture.Application\bin\Debug\net7.0\DigitalData.Core.Contracts.dll
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.CleanArchitecture.Application\bin\Debug\net7.0\DigitalData.Core.Contracts.pdb
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.CleanArchitecture.Application\obj\Debug\net7.0\DigitalData.Core.CleanArchitecture.Application.csproj.CopyComplete
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.CleanArchitecture.Application\obj\Debug\net7.0\ref\DigitalData.Core.CleanArchitecture.Application.dll
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.CleanArchitecture.Application\bin\Debug\net7.0\DigitalData.Core.Utilities.dll
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.CleanArchitecture.Application\bin\Debug\net7.0\DigitalData.Core.Utilities.pdb

View File

@@ -1,23 +0,0 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
using System;
using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("DigitalData.Core.Services")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")]
[assembly: System.Reflection.AssemblyProductAttribute("DigitalData.Core.Services")]
[assembly: System.Reflection.AssemblyTitleAttribute("DigitalData.Core.Services")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
// Generated by the MSBuild WriteCodeFragment class.

View File

@@ -1 +0,0 @@
eba1674d810a2e6af850ad2ebbb9a029e7f2ff0a

View File

@@ -1,11 +0,0 @@
is_global = true
build_property.TargetFramework = net7.0
build_property.TargetPlatformMinVersion =
build_property.UsingMicrosoftNETSdkWeb =
build_property.ProjectTypeGuids =
build_property.InvariantGlobalization =
build_property.PlatformNeutralAssembly =
build_property.EnforceExtendedAnalyzerRules =
build_property._SupportedPlatformList = Linux,macOS,Windows
build_property.RootNamespace = DigitalData.Core.Services
build_property.ProjectDir = E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.Application\

View File

@@ -1,8 +0,0 @@
// <auto-generated/>
global using global::System;
global using global::System.Collections.Generic;
global using global::System.IO;
global using global::System.Linq;
global using global::System.Net.Http;
global using global::System.Threading;
global using global::System.Threading.Tasks;

View File

@@ -1,16 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<RestoreSuccess Condition=" '$(RestoreSuccess)' == '' ">True</RestoreSuccess>
<RestoreTool Condition=" '$(RestoreTool)' == '' ">NuGet</RestoreTool>
<ProjectAssetsFile Condition=" '$(ProjectAssetsFile)' == '' ">$(MSBuildThisFileDirectory)project.assets.json</ProjectAssetsFile>
<NuGetPackageRoot Condition=" '$(NuGetPackageRoot)' == '' ">$(UserProfile)\.nuget\packages\</NuGetPackageRoot>
<NuGetPackageFolders Condition=" '$(NuGetPackageFolders)' == '' ">C:\Users\tekh\.nuget\packages\;D:\ProgramFiles\DevExpress 21.2\Components\Offline Packages</NuGetPackageFolders>
<NuGetProjectStyle Condition=" '$(NuGetProjectStyle)' == '' ">PackageReference</NuGetProjectStyle>
<NuGetToolVersion Condition=" '$(NuGetToolVersion)' == '' ">6.9.1</NuGetToolVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<SourceRoot Include="C:\Users\tekh\.nuget\packages\" />
<SourceRoot Include="D:\ProgramFiles\DevExpress 21.2\Components\Offline Packages\" />
</ItemGroup>
</Project>

View File

@@ -1,9 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ImportGroup Condition=" '$(TargetFramework)' == 'net7.0' AND '$(ExcludeRestorePackageImports)' != 'true' ">
<Import Project="$(NuGetPackageRoot)microsoft.extensions.logging.abstractions\7.0.0\buildTransitive\net6.0\Microsoft.Extensions.Logging.Abstractions.targets" Condition="Exists('$(NuGetPackageRoot)microsoft.extensions.logging.abstractions\7.0.0\buildTransitive\net6.0\Microsoft.Extensions.Logging.Abstractions.targets')" />
</ImportGroup>
<ImportGroup Condition=" '$(TargetFramework)' == 'net8.0' AND '$(ExcludeRestorePackageImports)' != 'true' ">
<Import Project="$(NuGetPackageRoot)microsoft.extensions.logging.abstractions\7.0.0\buildTransitive\net6.0\Microsoft.Extensions.Logging.Abstractions.targets" Condition="Exists('$(NuGetPackageRoot)microsoft.extensions.logging.abstractions\7.0.0\buildTransitive\net6.0\Microsoft.Extensions.Logging.Abstractions.targets')" />
</ImportGroup>
</Project>

View File

@@ -1,229 +0,0 @@
{
"format": 1,
"restore": {
"E:\\TekH\\Visual Studio\\DDWeb\\DigitalData.Core\\DigitalData.Core.CleanArchitecture.Application\\DigitalData.Core.CleanArchitecture.Application.csproj": {}
},
"projects": {
"E:\\TekH\\Visual Studio\\DDWeb\\DigitalData.Core\\DigitalData.Core.CleanArchitecture.Application\\DigitalData.Core.CleanArchitecture.Application.csproj": {
"version": "1.0.0",
"restore": {
"projectUniqueName": "E:\\TekH\\Visual Studio\\DDWeb\\DigitalData.Core\\DigitalData.Core.CleanArchitecture.Application\\DigitalData.Core.CleanArchitecture.Application.csproj",
"projectName": "DigitalData.Core.CleanArchitecture.Application",
"projectPath": "E:\\TekH\\Visual Studio\\DDWeb\\DigitalData.Core\\DigitalData.Core.CleanArchitecture.Application\\DigitalData.Core.CleanArchitecture.Application.csproj",
"packagesPath": "C:\\Users\\tekh\\.nuget\\packages\\",
"outputPath": "E:\\TekH\\Visual Studio\\DDWeb\\DigitalData.Core\\DigitalData.Core.CleanArchitecture.Application\\obj\\",
"projectStyle": "PackageReference",
"fallbackFolders": [
"D:\\ProgramFiles\\DevExpress 21.2\\Components\\Offline Packages",
"D:\\ProgramFiles\\DevExpress 22.1\\Components\\Offline Packages",
"C:\\Program Files\\dotnet\\sdk\\NuGetFallbackFolder"
],
"configFilePaths": [
"C:\\Users\\tekh\\AppData\\Roaming\\NuGet\\NuGet.Config",
"C:\\Program Files (x86)\\NuGet\\Config\\DevExpress 19.2.config",
"C:\\Program Files (x86)\\NuGet\\Config\\DevExpress 21.2.config",
"C:\\Program Files (x86)\\NuGet\\Config\\DevExpress 22.1.config",
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config"
],
"originalTargetFrameworks": [
"net7.0"
],
"sources": {
"C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {},
"D:\\ProgramFiles\\DevExpress 19.2\\Components\\System\\Components\\Packages": {},
"D:\\ProgramFiles\\DevExpress 21.2\\Components\\System\\Components\\Packages": {},
"D:\\ProgramFiles\\DevExpress 22.1\\Components\\System\\Components\\Packages": {},
"https://api.nuget.org/v3/index.json": {}
},
"frameworks": {
"net7.0": {
"targetAlias": "net7.0",
"projectReferences": {
"E:\\TekH\\Visual Studio\\DDWeb\\DigitalData.Core\\DigitalData.Core.Contracts\\DigitalData.Core.Contracts.csproj": {
"projectPath": "E:\\TekH\\Visual Studio\\DDWeb\\DigitalData.Core\\DigitalData.Core.Contracts\\DigitalData.Core.Contracts.csproj"
},
"E:\\TekH\\Visual Studio\\DDWeb\\DigitalData.Core\\DigitalData.Core.Utilities\\DigitalData.Core.Utilities.csproj": {
"projectPath": "E:\\TekH\\Visual Studio\\DDWeb\\DigitalData.Core\\DigitalData.Core.Utilities\\DigitalData.Core.Utilities.csproj"
}
}
}
},
"warningProperties": {
"warnAsError": [
"NU1605"
]
}
},
"frameworks": {
"net7.0": {
"targetAlias": "net7.0",
"dependencies": {
"AutoMapper": {
"target": "Package",
"version": "[13.0.1, )"
}
},
"imports": [
"net461",
"net462",
"net47",
"net471",
"net472",
"net48",
"net481"
],
"assetTargetFallback": true,
"warn": true,
"frameworkReferences": {
"Microsoft.NETCore.App": {
"privateAssets": "all"
}
},
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\7.0.202\\RuntimeIdentifierGraph.json"
}
}
},
"E:\\TekH\\Visual Studio\\DDWeb\\DigitalData.Core\\DigitalData.Core.Contracts\\DigitalData.Core.Contracts.csproj": {
"version": "1.0.0",
"restore": {
"projectUniqueName": "E:\\TekH\\Visual Studio\\DDWeb\\DigitalData.Core\\DigitalData.Core.Contracts\\DigitalData.Core.Contracts.csproj",
"projectName": "DigitalData.Core.Contracts",
"projectPath": "E:\\TekH\\Visual Studio\\DDWeb\\DigitalData.Core\\DigitalData.Core.Contracts\\DigitalData.Core.Contracts.csproj",
"packagesPath": "C:\\Users\\tekh\\.nuget\\packages\\",
"outputPath": "E:\\TekH\\Visual Studio\\DDWeb\\DigitalData.Core\\DigitalData.Core.Contracts\\obj\\",
"projectStyle": "PackageReference",
"fallbackFolders": [
"D:\\ProgramFiles\\DevExpress 21.2\\Components\\Offline Packages",
"D:\\ProgramFiles\\DevExpress 22.1\\Components\\Offline Packages",
"C:\\Program Files\\dotnet\\sdk\\NuGetFallbackFolder"
],
"configFilePaths": [
"C:\\Users\\tekh\\AppData\\Roaming\\NuGet\\NuGet.Config",
"C:\\Program Files (x86)\\NuGet\\Config\\DevExpress 19.2.config",
"C:\\Program Files (x86)\\NuGet\\Config\\DevExpress 21.2.config",
"C:\\Program Files (x86)\\NuGet\\Config\\DevExpress 22.1.config",
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config"
],
"originalTargetFrameworks": [
"net7.0"
],
"sources": {
"C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {},
"D:\\ProgramFiles\\DevExpress 19.2\\Components\\System\\Components\\Packages": {},
"D:\\ProgramFiles\\DevExpress 21.2\\Components\\System\\Components\\Packages": {},
"D:\\ProgramFiles\\DevExpress 22.1\\Components\\System\\Components\\Packages": {},
"https://api.nuget.org/v3/index.json": {}
},
"frameworks": {
"net7.0": {
"targetAlias": "net7.0",
"projectReferences": {}
}
},
"warningProperties": {
"warnAsError": [
"NU1605"
]
}
},
"frameworks": {
"net7.0": {
"targetAlias": "net7.0",
"dependencies": {
"System.DirectoryServices": {
"target": "Package",
"version": "[7.0.1, )"
}
},
"imports": [
"net461",
"net462",
"net47",
"net471",
"net472",
"net48",
"net481"
],
"assetTargetFallback": true,
"warn": true,
"frameworkReferences": {
"Microsoft.NETCore.App": {
"privateAssets": "all"
}
},
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\7.0.202\\RuntimeIdentifierGraph.json"
}
}
},
"E:\\TekH\\Visual Studio\\DDWeb\\DigitalData.Core\\DigitalData.Core.Utilities\\DigitalData.Core.Utilities.csproj": {
"version": "1.0.0",
"restore": {
"projectUniqueName": "E:\\TekH\\Visual Studio\\DDWeb\\DigitalData.Core\\DigitalData.Core.Utilities\\DigitalData.Core.Utilities.csproj",
"projectName": "DigitalData.Core.Utilities",
"projectPath": "E:\\TekH\\Visual Studio\\DDWeb\\DigitalData.Core\\DigitalData.Core.Utilities\\DigitalData.Core.Utilities.csproj",
"packagesPath": "C:\\Users\\tekh\\.nuget\\packages\\",
"outputPath": "E:\\TekH\\Visual Studio\\DDWeb\\DigitalData.Core\\DigitalData.Core.Utilities\\obj\\",
"projectStyle": "PackageReference",
"fallbackFolders": [
"D:\\ProgramFiles\\DevExpress 21.2\\Components\\Offline Packages",
"D:\\ProgramFiles\\DevExpress 22.1\\Components\\Offline Packages",
"C:\\Program Files\\dotnet\\sdk\\NuGetFallbackFolder"
],
"configFilePaths": [
"C:\\Users\\tekh\\AppData\\Roaming\\NuGet\\NuGet.Config",
"C:\\Program Files (x86)\\NuGet\\Config\\DevExpress 19.2.config",
"C:\\Program Files (x86)\\NuGet\\Config\\DevExpress 21.2.config",
"C:\\Program Files (x86)\\NuGet\\Config\\DevExpress 22.1.config",
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config"
],
"originalTargetFrameworks": [
"net7.0"
],
"sources": {
"C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {},
"D:\\ProgramFiles\\DevExpress 19.2\\Components\\System\\Components\\Packages": {},
"D:\\ProgramFiles\\DevExpress 21.2\\Components\\System\\Components\\Packages": {},
"D:\\ProgramFiles\\DevExpress 22.1\\Components\\System\\Components\\Packages": {},
"https://api.nuget.org/v3/index.json": {}
},
"frameworks": {
"net7.0": {
"targetAlias": "net7.0",
"projectReferences": {
"E:\\TekH\\Visual Studio\\DDWeb\\DigitalData.Core\\DigitalData.Core.Contracts\\DigitalData.Core.Contracts.csproj": {
"projectPath": "E:\\TekH\\Visual Studio\\DDWeb\\DigitalData.Core\\DigitalData.Core.Contracts\\DigitalData.Core.Contracts.csproj"
}
}
}
},
"warningProperties": {
"warnAsError": [
"NU1605"
]
}
},
"frameworks": {
"net7.0": {
"targetAlias": "net7.0",
"imports": [
"net461",
"net462",
"net47",
"net471",
"net472",
"net48",
"net481"
],
"assetTargetFallback": true,
"warn": true,
"frameworkReferences": {
"Microsoft.NETCore.App": {
"privateAssets": "all"
}
},
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\7.0.202\\RuntimeIdentifierGraph.json"
}
}
}
}
}

View File

@@ -1,18 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<RestoreSuccess Condition=" '$(RestoreSuccess)' == '' ">True</RestoreSuccess>
<RestoreTool Condition=" '$(RestoreTool)' == '' ">NuGet</RestoreTool>
<ProjectAssetsFile Condition=" '$(ProjectAssetsFile)' == '' ">$(MSBuildThisFileDirectory)project.assets.json</ProjectAssetsFile>
<NuGetPackageRoot Condition=" '$(NuGetPackageRoot)' == '' ">$(UserProfile)\.nuget\packages\</NuGetPackageRoot>
<NuGetPackageFolders Condition=" '$(NuGetPackageFolders)' == '' ">C:\Users\tekh\.nuget\packages\;D:\ProgramFiles\DevExpress 21.2\Components\Offline Packages;D:\ProgramFiles\DevExpress 22.1\Components\Offline Packages;C:\Program Files\dotnet\sdk\NuGetFallbackFolder</NuGetPackageFolders>
<NuGetProjectStyle Condition=" '$(NuGetProjectStyle)' == '' ">PackageReference</NuGetProjectStyle>
<NuGetToolVersion Condition=" '$(NuGetToolVersion)' == '' ">6.5.0</NuGetToolVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<SourceRoot Include="C:\Users\tekh\.nuget\packages\" />
<SourceRoot Include="D:\ProgramFiles\DevExpress 21.2\Components\Offline Packages\" />
<SourceRoot Include="D:\ProgramFiles\DevExpress 22.1\Components\Offline Packages\" />
<SourceRoot Include="C:\Program Files\dotnet\sdk\NuGetFallbackFolder\" />
</ItemGroup>
</Project>

View File

@@ -1,2 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" />

View File

@@ -1,229 +0,0 @@
{
"format": 1,
"restore": {
"E:\\TekH\\Visual Studio\\DDWeb\\DigitalData.Core\\DigitalData.Core.Application\\DigitalData.Core.Services.csproj": {}
},
"projects": {
"E:\\TekH\\Visual Studio\\DDWeb\\DigitalData.Core\\DigitalData.Core.Application\\DigitalData.Core.Services.csproj": {
"version": "1.0.0",
"restore": {
"projectUniqueName": "E:\\TekH\\Visual Studio\\DDWeb\\DigitalData.Core\\DigitalData.Core.Application\\DigitalData.Core.Services.csproj",
"projectName": "DigitalData.Core.Services",
"projectPath": "E:\\TekH\\Visual Studio\\DDWeb\\DigitalData.Core\\DigitalData.Core.Application\\DigitalData.Core.Services.csproj",
"packagesPath": "C:\\Users\\tekh\\.nuget\\packages\\",
"outputPath": "E:\\TekH\\Visual Studio\\DDWeb\\DigitalData.Core\\DigitalData.Core.Application\\obj\\",
"projectStyle": "PackageReference",
"fallbackFolders": [
"D:\\ProgramFiles\\DevExpress 21.2\\Components\\Offline Packages",
"D:\\ProgramFiles\\DevExpress 22.1\\Components\\Offline Packages",
"C:\\Program Files\\dotnet\\sdk\\NuGetFallbackFolder"
],
"configFilePaths": [
"C:\\Users\\tekh\\AppData\\Roaming\\NuGet\\NuGet.Config",
"C:\\Program Files (x86)\\NuGet\\Config\\DevExpress 19.2.config",
"C:\\Program Files (x86)\\NuGet\\Config\\DevExpress 21.2.config",
"C:\\Program Files (x86)\\NuGet\\Config\\DevExpress 22.1.config",
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config"
],
"originalTargetFrameworks": [
"net7.0"
],
"sources": {
"C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {},
"D:\\ProgramFiles\\DevExpress 19.2\\Components\\System\\Components\\Packages": {},
"D:\\ProgramFiles\\DevExpress 21.2\\Components\\System\\Components\\Packages": {},
"D:\\ProgramFiles\\DevExpress 22.1\\Components\\System\\Components\\Packages": {},
"https://api.nuget.org/v3/index.json": {}
},
"frameworks": {
"net7.0": {
"targetAlias": "net7.0",
"projectReferences": {
"E:\\TekH\\Visual Studio\\DDWeb\\DigitalData.Core\\DigitalData.Core.Contracts\\DigitalData.Core.Contracts.csproj": {
"projectPath": "E:\\TekH\\Visual Studio\\DDWeb\\DigitalData.Core\\DigitalData.Core.Contracts\\DigitalData.Core.Contracts.csproj"
},
"E:\\TekH\\Visual Studio\\DDWeb\\DigitalData.Core\\DigitalData.Core.Utilities\\DigitalData.Core.Utilities.csproj": {
"projectPath": "E:\\TekH\\Visual Studio\\DDWeb\\DigitalData.Core\\DigitalData.Core.Utilities\\DigitalData.Core.Utilities.csproj"
}
}
}
},
"warningProperties": {
"warnAsError": [
"NU1605"
]
}
},
"frameworks": {
"net7.0": {
"targetAlias": "net7.0",
"dependencies": {
"AutoMapper": {
"target": "Package",
"version": "[13.0.1, )"
}
},
"imports": [
"net461",
"net462",
"net47",
"net471",
"net472",
"net48",
"net481"
],
"assetTargetFallback": true,
"warn": true,
"frameworkReferences": {
"Microsoft.NETCore.App": {
"privateAssets": "all"
}
},
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\7.0.202\\RuntimeIdentifierGraph.json"
}
}
},
"E:\\TekH\\Visual Studio\\DDWeb\\DigitalData.Core\\DigitalData.Core.Contracts\\DigitalData.Core.Contracts.csproj": {
"version": "1.0.0",
"restore": {
"projectUniqueName": "E:\\TekH\\Visual Studio\\DDWeb\\DigitalData.Core\\DigitalData.Core.Contracts\\DigitalData.Core.Contracts.csproj",
"projectName": "DigitalData.Core.Contracts",
"projectPath": "E:\\TekH\\Visual Studio\\DDWeb\\DigitalData.Core\\DigitalData.Core.Contracts\\DigitalData.Core.Contracts.csproj",
"packagesPath": "C:\\Users\\tekh\\.nuget\\packages\\",
"outputPath": "E:\\TekH\\Visual Studio\\DDWeb\\DigitalData.Core\\DigitalData.Core.Contracts\\obj\\",
"projectStyle": "PackageReference",
"fallbackFolders": [
"D:\\ProgramFiles\\DevExpress 21.2\\Components\\Offline Packages",
"D:\\ProgramFiles\\DevExpress 22.1\\Components\\Offline Packages",
"C:\\Program Files\\dotnet\\sdk\\NuGetFallbackFolder"
],
"configFilePaths": [
"C:\\Users\\tekh\\AppData\\Roaming\\NuGet\\NuGet.Config",
"C:\\Program Files (x86)\\NuGet\\Config\\DevExpress 19.2.config",
"C:\\Program Files (x86)\\NuGet\\Config\\DevExpress 21.2.config",
"C:\\Program Files (x86)\\NuGet\\Config\\DevExpress 22.1.config",
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config"
],
"originalTargetFrameworks": [
"net7.0"
],
"sources": {
"C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {},
"D:\\ProgramFiles\\DevExpress 19.2\\Components\\System\\Components\\Packages": {},
"D:\\ProgramFiles\\DevExpress 21.2\\Components\\System\\Components\\Packages": {},
"D:\\ProgramFiles\\DevExpress 22.1\\Components\\System\\Components\\Packages": {},
"https://api.nuget.org/v3/index.json": {}
},
"frameworks": {
"net7.0": {
"targetAlias": "net7.0",
"projectReferences": {}
}
},
"warningProperties": {
"warnAsError": [
"NU1605"
]
}
},
"frameworks": {
"net7.0": {
"targetAlias": "net7.0",
"dependencies": {
"System.DirectoryServices": {
"target": "Package",
"version": "[7.0.1, )"
}
},
"imports": [
"net461",
"net462",
"net47",
"net471",
"net472",
"net48",
"net481"
],
"assetTargetFallback": true,
"warn": true,
"frameworkReferences": {
"Microsoft.NETCore.App": {
"privateAssets": "all"
}
},
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\7.0.202\\RuntimeIdentifierGraph.json"
}
}
},
"E:\\TekH\\Visual Studio\\DDWeb\\DigitalData.Core\\DigitalData.Core.Utilities\\DigitalData.Core.Utilities.csproj": {
"version": "1.0.0",
"restore": {
"projectUniqueName": "E:\\TekH\\Visual Studio\\DDWeb\\DigitalData.Core\\DigitalData.Core.Utilities\\DigitalData.Core.Utilities.csproj",
"projectName": "DigitalData.Core.Utilities",
"projectPath": "E:\\TekH\\Visual Studio\\DDWeb\\DigitalData.Core\\DigitalData.Core.Utilities\\DigitalData.Core.Utilities.csproj",
"packagesPath": "C:\\Users\\tekh\\.nuget\\packages\\",
"outputPath": "E:\\TekH\\Visual Studio\\DDWeb\\DigitalData.Core\\DigitalData.Core.Utilities\\obj\\",
"projectStyle": "PackageReference",
"fallbackFolders": [
"D:\\ProgramFiles\\DevExpress 21.2\\Components\\Offline Packages",
"D:\\ProgramFiles\\DevExpress 22.1\\Components\\Offline Packages",
"C:\\Program Files\\dotnet\\sdk\\NuGetFallbackFolder"
],
"configFilePaths": [
"C:\\Users\\tekh\\AppData\\Roaming\\NuGet\\NuGet.Config",
"C:\\Program Files (x86)\\NuGet\\Config\\DevExpress 19.2.config",
"C:\\Program Files (x86)\\NuGet\\Config\\DevExpress 21.2.config",
"C:\\Program Files (x86)\\NuGet\\Config\\DevExpress 22.1.config",
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config"
],
"originalTargetFrameworks": [
"net7.0"
],
"sources": {
"C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {},
"D:\\ProgramFiles\\DevExpress 19.2\\Components\\System\\Components\\Packages": {},
"D:\\ProgramFiles\\DevExpress 21.2\\Components\\System\\Components\\Packages": {},
"D:\\ProgramFiles\\DevExpress 22.1\\Components\\System\\Components\\Packages": {},
"https://api.nuget.org/v3/index.json": {}
},
"frameworks": {
"net7.0": {
"targetAlias": "net7.0",
"projectReferences": {
"E:\\TekH\\Visual Studio\\DDWeb\\DigitalData.Core\\DigitalData.Core.Contracts\\DigitalData.Core.Contracts.csproj": {
"projectPath": "E:\\TekH\\Visual Studio\\DDWeb\\DigitalData.Core\\DigitalData.Core.Contracts\\DigitalData.Core.Contracts.csproj"
}
}
}
},
"warningProperties": {
"warnAsError": [
"NU1605"
]
}
},
"frameworks": {
"net7.0": {
"targetAlias": "net7.0",
"imports": [
"net461",
"net462",
"net47",
"net471",
"net472",
"net48",
"net481"
],
"assetTargetFallback": true,
"warn": true,
"frameworkReferences": {
"Microsoft.NETCore.App": {
"privateAssets": "all"
}
},
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\7.0.202\\RuntimeIdentifierGraph.json"
}
}
}
}
}

View File

@@ -1,18 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<RestoreSuccess Condition=" '$(RestoreSuccess)' == '' ">True</RestoreSuccess>
<RestoreTool Condition=" '$(RestoreTool)' == '' ">NuGet</RestoreTool>
<ProjectAssetsFile Condition=" '$(ProjectAssetsFile)' == '' ">$(MSBuildThisFileDirectory)project.assets.json</ProjectAssetsFile>
<NuGetPackageRoot Condition=" '$(NuGetPackageRoot)' == '' ">$(UserProfile)\.nuget\packages\</NuGetPackageRoot>
<NuGetPackageFolders Condition=" '$(NuGetPackageFolders)' == '' ">C:\Users\tekh\.nuget\packages\;D:\ProgramFiles\DevExpress 21.2\Components\Offline Packages;D:\ProgramFiles\DevExpress 22.1\Components\Offline Packages;C:\Program Files\dotnet\sdk\NuGetFallbackFolder</NuGetPackageFolders>
<NuGetProjectStyle Condition=" '$(NuGetProjectStyle)' == '' ">PackageReference</NuGetProjectStyle>
<NuGetToolVersion Condition=" '$(NuGetToolVersion)' == '' ">6.5.0</NuGetToolVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<SourceRoot Include="C:\Users\tekh\.nuget\packages\" />
<SourceRoot Include="D:\ProgramFiles\DevExpress 21.2\Components\Offline Packages\" />
<SourceRoot Include="D:\ProgramFiles\DevExpress 22.1\Components\Offline Packages\" />
<SourceRoot Include="C:\Program Files\dotnet\sdk\NuGetFallbackFolder\" />
</ItemGroup>
</Project>

View File

@@ -1,2 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" />

View File

@@ -1,4 +0,0 @@
// <autogenerated />
using System;
using System.Reflection;
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v7.0", FrameworkDisplayName = ".NET 7.0")]

View File

@@ -1,13 +0,0 @@
is_global = true
build_property.TargetFramework = net7.0
build_property.TargetPlatformMinVersion =
build_property.UsingMicrosoftNETSdkWeb =
build_property.ProjectTypeGuids =
build_property.InvariantGlobalization =
build_property.PlatformNeutralAssembly =
build_property.EnforceExtendedAnalyzerRules =
build_property._SupportedPlatformList = Linux,macOS,Windows
build_property.RootNamespace = DigitalData.Core.Application
build_property.ProjectDir = E:\TekH\Visual Studio\WebCoreModules\DigitalData.Core.Application\
build_property.EnableComHosting =
build_property.EnableGeneratedComInterfaceComImportInterop =

View File

@@ -1,8 +0,0 @@
// <auto-generated/>
global using global::System;
global using global::System.Collections.Generic;
global using global::System.IO;
global using global::System.Linq;
global using global::System.Net.Http;
global using global::System.Threading;
global using global::System.Threading.Tasks;

View File

@@ -9,28 +9,36 @@ namespace DigitalData.Core.DTO
public static class DTOExtensions
{
/// <summary>
/// Adds a single message to the result.
/// Adds a single message to the result, if not null.
/// </summary>
/// <typeparam name="T">The type of the result.</typeparam>
/// <param name="result">The result to add the message to.</param>
/// <param name="message">The message to add.</param>
/// <returns>The updated result.</returns>
public static T Message<T>(this T result, string message) where T : Result
public static T Message<T>(this T result, string? message) where T : Result
{
result.Messages.Add(message);
if(message is not null)
result.Messages.Add(message);
return result;
}
internal static IEnumerable<T> FilterNull<T>(this IEnumerable<T?> list)
{
foreach (var item in list)
if(item is not null)
yield return item;
}
/// <summary>
/// Adds multiple messages to the result.
/// Adds multiple messages to the result, after removing nulls.
/// </summary>
/// <typeparam name="T">The type of the result.</typeparam>
/// <param name="result">The result to add the messages to.</param>
/// <param name="messages">The messages to add.</param>
/// <returns>The updated result.</returns>
public static T Message<T>(this T result, params string[] messages) where T : Result
public static T Message<T>(this T result, params string?[] messages) where T : Result
{
result.Messages.AddRange(messages);
result.Messages.AddRange(messages.FilterNull());
return result;
}
@@ -41,9 +49,9 @@ namespace DigitalData.Core.DTO
/// <param name="result">The result to add the messages to.</param>
/// <param name="messages">The collection of messages to add.</param>
/// <returns>The updated result.</returns>
public static T Message<T>(this T result, IEnumerable<string> messages) where T : Result
public static T Message<T>(this T result, IEnumerable<string?> messages) where T : Result
{
result.Messages.AddRange(messages);
result.Messages.AddRange(messages.FilterNull());
return result;
}
@@ -101,13 +109,13 @@ namespace DigitalData.Core.DTO
/// <param name="flag">The flag associated with the notice.</param>
/// <param name="messages">The messages to add to the notice.</param>
/// <returns>The updated result.</returns>
public static T Notice<T>(this T result, LogLevel level, Enum flag, params string[] messages) where T : Result
public static T Notice<T>(this T result, LogLevel level, Enum flag, params string?[] messages) where T : Result
{
result.Notices.Add(new Notice()
{
Flag = flag,
Level = level,
Messages = messages.ToList()
Messages = messages.FilterNull().ToList()
});
return result;
}
@@ -126,7 +134,7 @@ namespace DigitalData.Core.DTO
{
Flag = null,
Level = level,
Messages = messages.ToList()
Messages = messages.FilterNull().ToList()
});
return result;
}

View File

@@ -7,7 +7,7 @@
<Description>This package provides Data Transfer Object (DTO) implementations and related utilities. It includes generic result handling, DTO extension methods, cookie consent settings management, and AutoMapper integration for robust object mapping, all adhering to Clean Architecture principles to ensure separation of concerns and maintainability.</Description>
<GeneratePackageOnBuild>True</GeneratePackageOnBuild>
<PackageId>DigitalData.Core.DTO</PackageId>
<Version>2.0.0.0</Version>
<Version>2.0.1</Version>
<Authors>Digital Data GmbH</Authors>
<Company>Digital Data GmbH</Company>
<Product>DigitalData.Core.DTO</Product>
@@ -15,6 +15,8 @@
<PackageIcon>core_icon.png</PackageIcon>
<RepositoryUrl>http://git.dd:3000/AppStd/WebCoreModules.git</RepositoryUrl>
<PackageTags>digital data core dto clean architecture result pattern</PackageTags>
<AssemblyVersion>2.0.1</AssemblyVersion>
<FileVersion>2.0.1</FileVersion>
</PropertyGroup>
<ItemGroup>

View File

@@ -1,4 +0,0 @@
// <autogenerated />
using System;
using System.Reflection;
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v7.0", FrameworkDisplayName = ".NET 7.0")]

View File

@@ -1,23 +0,0 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
using System;
using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("DigitalData.Core.CleanArchitecture.Infrastructure")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")]
[assembly: System.Reflection.AssemblyProductAttribute("DigitalData.Core.CleanArchitecture.Infrastructure")]
[assembly: System.Reflection.AssemblyTitleAttribute("DigitalData.Core.CleanArchitecture.Infrastructure")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
// Generated by the MSBuild WriteCodeFragment class.

View File

@@ -1,11 +0,0 @@
is_global = true
build_property.TargetFramework = net7.0
build_property.TargetPlatformMinVersion =
build_property.UsingMicrosoftNETSdkWeb =
build_property.ProjectTypeGuids =
build_property.InvariantGlobalization =
build_property.PlatformNeutralAssembly =
build_property.EnforceExtendedAnalyzerRules =
build_property._SupportedPlatformList = Linux,macOS,Windows
build_property.RootNamespace = DigitalData.Core.CleanArchitecture.Infrastructure
build_property.ProjectDir = E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.CleanArchitecture.Infrastructure\

View File

@@ -1,8 +0,0 @@
// <auto-generated/>
global using global::System;
global using global::System.Collections.Generic;
global using global::System.IO;
global using global::System.Linq;
global using global::System.Net.Http;
global using global::System.Threading;
global using global::System.Threading.Tasks;

View File

@@ -1,30 +0,0 @@
E:\TekH\Visual Studio\DigitalData\DigitalData.Core\DigitalData.Core.CleanArchitecture.Infrastructure\bin\Debug\net7.0\DigitalData.Core.CleanArchitecture.Infrastructure.deps.json
E:\TekH\Visual Studio\DigitalData\DigitalData.Core\DigitalData.Core.CleanArchitecture.Infrastructure\bin\Debug\net7.0\DigitalData.Core.CleanArchitecture.Infrastructure.dll
E:\TekH\Visual Studio\DigitalData\DigitalData.Core\DigitalData.Core.CleanArchitecture.Infrastructure\bin\Debug\net7.0\DigitalData.Core.CleanArchitecture.Infrastructure.pdb
E:\TekH\Visual Studio\DigitalData\DigitalData.Core\DigitalData.Core.CleanArchitecture.Infrastructure\bin\Debug\net7.0\DigitalData.Core.Contracts.dll
E:\TekH\Visual Studio\DigitalData\DigitalData.Core\DigitalData.Core.CleanArchitecture.Infrastructure\bin\Debug\net7.0\DigitalData.Core.Contracts.pdb
E:\TekH\Visual Studio\DigitalData\DigitalData.Core\DigitalData.Core.CleanArchitecture.Infrastructure\obj\Debug\net7.0\DigitalData.Core.CleanArchitecture.Infrastructure.csproj.AssemblyReference.cache
E:\TekH\Visual Studio\DigitalData\DigitalData.Core\DigitalData.Core.CleanArchitecture.Infrastructure\obj\Debug\net7.0\DigitalData.Core.CleanArchitecture.Infrastructure.GeneratedMSBuildEditorConfig.editorconfig
E:\TekH\Visual Studio\DigitalData\DigitalData.Core\DigitalData.Core.CleanArchitecture.Infrastructure\obj\Debug\net7.0\DigitalData.Core.CleanArchitecture.Infrastructure.AssemblyInfoInputs.cache
E:\TekH\Visual Studio\DigitalData\DigitalData.Core\DigitalData.Core.CleanArchitecture.Infrastructure\obj\Debug\net7.0\DigitalData.Core.CleanArchitecture.Infrastructure.AssemblyInfo.cs
E:\TekH\Visual Studio\DigitalData\DigitalData.Core\DigitalData.Core.CleanArchitecture.Infrastructure\obj\Debug\net7.0\DigitalData.Core.CleanArchitecture.Infrastructure.csproj.CoreCompileInputs.cache
E:\TekH\Visual Studio\DigitalData\DigitalData.Core\DigitalData.Core.CleanArchitecture.Infrastructure\obj\Debug\net7.0\DigitalData.Core.CleanArchitecture.Infrastructure.csproj.CopyComplete
E:\TekH\Visual Studio\DigitalData\DigitalData.Core\DigitalData.Core.CleanArchitecture.Infrastructure\obj\Debug\net7.0\DigitalData.Core.CleanArchitecture.Infrastructure.dll
E:\TekH\Visual Studio\DigitalData\DigitalData.Core\DigitalData.Core.CleanArchitecture.Infrastructure\obj\Debug\net7.0\refint\DigitalData.Core.CleanArchitecture.Infrastructure.dll
E:\TekH\Visual Studio\DigitalData\DigitalData.Core\DigitalData.Core.CleanArchitecture.Infrastructure\obj\Debug\net7.0\DigitalData.Core.CleanArchitecture.Infrastructure.pdb
E:\TekH\Visual Studio\DigitalData\DigitalData.Core\DigitalData.Core.CleanArchitecture.Infrastructure\obj\Debug\net7.0\ref\DigitalData.Core.CleanArchitecture.Infrastructure.dll
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.CleanArchitecture.Infrastructure\bin\Debug\net7.0\DigitalData.Core.CleanArchitecture.Infrastructure.deps.json
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.CleanArchitecture.Infrastructure\bin\Debug\net7.0\DigitalData.Core.CleanArchitecture.Infrastructure.dll
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.CleanArchitecture.Infrastructure\bin\Debug\net7.0\DigitalData.Core.CleanArchitecture.Infrastructure.pdb
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.CleanArchitecture.Infrastructure\bin\Debug\net7.0\DigitalData.Core.Contracts.dll
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.CleanArchitecture.Infrastructure\bin\Debug\net7.0\DigitalData.Core.Contracts.pdb
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.CleanArchitecture.Infrastructure\obj\Debug\net7.0\DigitalData.Core.CleanArchitecture.Infrastructure.csproj.AssemblyReference.cache
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.CleanArchitecture.Infrastructure\obj\Debug\net7.0\DigitalData.Core.CleanArchitecture.Infrastructure.GeneratedMSBuildEditorConfig.editorconfig
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.CleanArchitecture.Infrastructure\obj\Debug\net7.0\DigitalData.Core.CleanArchitecture.Infrastructure.AssemblyInfoInputs.cache
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.CleanArchitecture.Infrastructure\obj\Debug\net7.0\DigitalData.Core.CleanArchitecture.Infrastructure.AssemblyInfo.cs
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.CleanArchitecture.Infrastructure\obj\Debug\net7.0\DigitalData.Core.CleanArchitecture.Infrastructure.csproj.CoreCompileInputs.cache
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.CleanArchitecture.Infrastructure\obj\Debug\net7.0\DigitalData.Core.CleanArchitecture.Infrastructure.csproj.CopyComplete
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.CleanArchitecture.Infrastructure\obj\Debug\net7.0\DigitalData.Core.CleanArchitecture.Infrastructure.dll
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.CleanArchitecture.Infrastructure\obj\Debug\net7.0\refint\DigitalData.Core.CleanArchitecture.Infrastructure.dll
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.CleanArchitecture.Infrastructure\obj\Debug\net7.0\DigitalData.Core.CleanArchitecture.Infrastructure.pdb
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.CleanArchitecture.Infrastructure\obj\Debug\net7.0\ref\DigitalData.Core.CleanArchitecture.Infrastructure.dll

View File

@@ -1,8 +0,0 @@
// <auto-generated/>
global using global::System;
global using global::System.Collections.Generic;
global using global::System.IO;
global using global::System.Linq;
global using global::System.Net.Http;
global using global::System.Threading;
global using global::System.Threading.Tasks;

View File

@@ -1,156 +0,0 @@
{
"format": 1,
"restore": {
"E:\\TekH\\Visual Studio\\DDWeb\\DigitalData.Core\\DigitalData.Core.CleanArchitecture.Infrastructure\\DigitalData.Core.CleanArchitecture.Infrastructure.csproj": {}
},
"projects": {
"E:\\TekH\\Visual Studio\\DDWeb\\DigitalData.Core\\DigitalData.Core.CleanArchitecture.Infrastructure\\DigitalData.Core.CleanArchitecture.Infrastructure.csproj": {
"version": "1.0.0",
"restore": {
"projectUniqueName": "E:\\TekH\\Visual Studio\\DDWeb\\DigitalData.Core\\DigitalData.Core.CleanArchitecture.Infrastructure\\DigitalData.Core.CleanArchitecture.Infrastructure.csproj",
"projectName": "DigitalData.Core.CleanArchitecture.Infrastructure",
"projectPath": "E:\\TekH\\Visual Studio\\DDWeb\\DigitalData.Core\\DigitalData.Core.CleanArchitecture.Infrastructure\\DigitalData.Core.CleanArchitecture.Infrastructure.csproj",
"packagesPath": "C:\\Users\\tekh\\.nuget\\packages\\",
"outputPath": "E:\\TekH\\Visual Studio\\DDWeb\\DigitalData.Core\\DigitalData.Core.CleanArchitecture.Infrastructure\\obj\\",
"projectStyle": "PackageReference",
"fallbackFolders": [
"D:\\ProgramFiles\\DevExpress 21.2\\Components\\Offline Packages",
"D:\\ProgramFiles\\DevExpress 22.1\\Components\\Offline Packages",
"C:\\Program Files\\dotnet\\sdk\\NuGetFallbackFolder"
],
"configFilePaths": [
"C:\\Users\\tekh\\AppData\\Roaming\\NuGet\\NuGet.Config",
"C:\\Program Files (x86)\\NuGet\\Config\\DevExpress 19.2.config",
"C:\\Program Files (x86)\\NuGet\\Config\\DevExpress 21.2.config",
"C:\\Program Files (x86)\\NuGet\\Config\\DevExpress 22.1.config",
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config"
],
"originalTargetFrameworks": [
"net7.0"
],
"sources": {
"C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {},
"D:\\ProgramFiles\\DevExpress 19.2\\Components\\System\\Components\\Packages": {},
"D:\\ProgramFiles\\DevExpress 21.2\\Components\\System\\Components\\Packages": {},
"D:\\ProgramFiles\\DevExpress 22.1\\Components\\System\\Components\\Packages": {},
"https://api.nuget.org/v3/index.json": {}
},
"frameworks": {
"net7.0": {
"targetAlias": "net7.0",
"projectReferences": {
"E:\\TekH\\Visual Studio\\DDWeb\\DigitalData.Core\\DigitalData.Core.Contracts\\DigitalData.Core.Contracts.csproj": {
"projectPath": "E:\\TekH\\Visual Studio\\DDWeb\\DigitalData.Core\\DigitalData.Core.Contracts\\DigitalData.Core.Contracts.csproj"
}
}
}
},
"warningProperties": {
"warnAsError": [
"NU1605"
]
}
},
"frameworks": {
"net7.0": {
"targetAlias": "net7.0",
"dependencies": {
"Microsoft.EntityFrameworkCore": {
"target": "Package",
"version": "[7.0.16, )"
}
},
"imports": [
"net461",
"net462",
"net47",
"net471",
"net472",
"net48",
"net481"
],
"assetTargetFallback": true,
"warn": true,
"frameworkReferences": {
"Microsoft.NETCore.App": {
"privateAssets": "all"
}
},
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\7.0.202\\RuntimeIdentifierGraph.json"
}
}
},
"E:\\TekH\\Visual Studio\\DDWeb\\DigitalData.Core\\DigitalData.Core.Contracts\\DigitalData.Core.Contracts.csproj": {
"version": "1.0.0",
"restore": {
"projectUniqueName": "E:\\TekH\\Visual Studio\\DDWeb\\DigitalData.Core\\DigitalData.Core.Contracts\\DigitalData.Core.Contracts.csproj",
"projectName": "DigitalData.Core.Contracts",
"projectPath": "E:\\TekH\\Visual Studio\\DDWeb\\DigitalData.Core\\DigitalData.Core.Contracts\\DigitalData.Core.Contracts.csproj",
"packagesPath": "C:\\Users\\tekh\\.nuget\\packages\\",
"outputPath": "E:\\TekH\\Visual Studio\\DDWeb\\DigitalData.Core\\DigitalData.Core.Contracts\\obj\\",
"projectStyle": "PackageReference",
"fallbackFolders": [
"D:\\ProgramFiles\\DevExpress 21.2\\Components\\Offline Packages",
"D:\\ProgramFiles\\DevExpress 22.1\\Components\\Offline Packages",
"C:\\Program Files\\dotnet\\sdk\\NuGetFallbackFolder"
],
"configFilePaths": [
"C:\\Users\\tekh\\AppData\\Roaming\\NuGet\\NuGet.Config",
"C:\\Program Files (x86)\\NuGet\\Config\\DevExpress 19.2.config",
"C:\\Program Files (x86)\\NuGet\\Config\\DevExpress 21.2.config",
"C:\\Program Files (x86)\\NuGet\\Config\\DevExpress 22.1.config",
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config"
],
"originalTargetFrameworks": [
"net7.0"
],
"sources": {
"C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {},
"D:\\ProgramFiles\\DevExpress 19.2\\Components\\System\\Components\\Packages": {},
"D:\\ProgramFiles\\DevExpress 21.2\\Components\\System\\Components\\Packages": {},
"D:\\ProgramFiles\\DevExpress 22.1\\Components\\System\\Components\\Packages": {},
"https://api.nuget.org/v3/index.json": {}
},
"frameworks": {
"net7.0": {
"targetAlias": "net7.0",
"projectReferences": {}
}
},
"warningProperties": {
"warnAsError": [
"NU1605"
]
}
},
"frameworks": {
"net7.0": {
"targetAlias": "net7.0",
"dependencies": {
"System.DirectoryServices": {
"target": "Package",
"version": "[7.0.1, )"
}
},
"imports": [
"net461",
"net462",
"net47",
"net471",
"net472",
"net48",
"net481"
],
"assetTargetFallback": true,
"warn": true,
"frameworkReferences": {
"Microsoft.NETCore.App": {
"privateAssets": "all"
}
},
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\7.0.202\\RuntimeIdentifierGraph.json"
}
}
}
}
}

View File

@@ -1,21 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<RestoreSuccess Condition=" '$(RestoreSuccess)' == '' ">True</RestoreSuccess>
<RestoreTool Condition=" '$(RestoreTool)' == '' ">NuGet</RestoreTool>
<ProjectAssetsFile Condition=" '$(ProjectAssetsFile)' == '' ">$(MSBuildThisFileDirectory)project.assets.json</ProjectAssetsFile>
<NuGetPackageRoot Condition=" '$(NuGetPackageRoot)' == '' ">$(UserProfile)\.nuget\packages\</NuGetPackageRoot>
<NuGetPackageFolders Condition=" '$(NuGetPackageFolders)' == '' ">C:\Users\tekh\.nuget\packages\;D:\ProgramFiles\DevExpress 21.2\Components\Offline Packages;D:\ProgramFiles\DevExpress 22.1\Components\Offline Packages;C:\Program Files\dotnet\sdk\NuGetFallbackFolder</NuGetPackageFolders>
<NuGetProjectStyle Condition=" '$(NuGetProjectStyle)' == '' ">PackageReference</NuGetProjectStyle>
<NuGetToolVersion Condition=" '$(NuGetToolVersion)' == '' ">6.5.0</NuGetToolVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<SourceRoot Include="C:\Users\tekh\.nuget\packages\" />
<SourceRoot Include="D:\ProgramFiles\DevExpress 21.2\Components\Offline Packages\" />
<SourceRoot Include="D:\ProgramFiles\DevExpress 22.1\Components\Offline Packages\" />
<SourceRoot Include="C:\Program Files\dotnet\sdk\NuGetFallbackFolder\" />
</ItemGroup>
<ImportGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<Import Project="$(NuGetPackageRoot)microsoft.entityframeworkcore\7.0.16\buildTransitive\net6.0\Microsoft.EntityFrameworkCore.props" Condition="Exists('$(NuGetPackageRoot)microsoft.entityframeworkcore\7.0.16\buildTransitive\net6.0\Microsoft.EntityFrameworkCore.props')" />
</ImportGroup>
</Project>

View File

@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ImportGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<Import Project="$(NuGetPackageRoot)microsoft.extensions.logging.abstractions\7.0.0\buildTransitive\net6.0\Microsoft.Extensions.Logging.Abstractions.targets" Condition="Exists('$(NuGetPackageRoot)microsoft.extensions.logging.abstractions\7.0.0\buildTransitive\net6.0\Microsoft.Extensions.Logging.Abstractions.targets')" />
</ImportGroup>
</Project>

View File

@@ -1,22 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<RestoreSuccess Condition=" '$(RestoreSuccess)' == '' ">True</RestoreSuccess>
<RestoreTool Condition=" '$(RestoreTool)' == '' ">NuGet</RestoreTool>
<ProjectAssetsFile Condition=" '$(ProjectAssetsFile)' == '' ">$(MSBuildThisFileDirectory)project.assets.json</ProjectAssetsFile>
<NuGetPackageRoot Condition=" '$(NuGetPackageRoot)' == '' ">$(UserProfile)\.nuget\packages\</NuGetPackageRoot>
<NuGetPackageFolders Condition=" '$(NuGetPackageFolders)' == '' ">C:\Users\tekh\.nuget\packages\;D:\ProgramFiles\DevExpress 21.2\Components\Offline Packages</NuGetPackageFolders>
<NuGetProjectStyle Condition=" '$(NuGetProjectStyle)' == '' ">PackageReference</NuGetProjectStyle>
<NuGetToolVersion Condition=" '$(NuGetToolVersion)' == '' ">6.9.1</NuGetToolVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<SourceRoot Include="C:\Users\tekh\.nuget\packages\" />
<SourceRoot Include="D:\ProgramFiles\DevExpress 21.2\Components\Offline Packages\" />
</ItemGroup>
<ImportGroup Condition=" '$(TargetFramework)' == 'net7.0' AND '$(ExcludeRestorePackageImports)' != 'true' ">
<Import Project="$(NuGetPackageRoot)microsoft.entityframeworkcore\7.0.16\buildTransitive\net6.0\Microsoft.EntityFrameworkCore.props" Condition="Exists('$(NuGetPackageRoot)microsoft.entityframeworkcore\7.0.16\buildTransitive\net6.0\Microsoft.EntityFrameworkCore.props')" />
</ImportGroup>
<ImportGroup Condition=" '$(TargetFramework)' == 'net8.0' AND '$(ExcludeRestorePackageImports)' != 'true' ">
<Import Project="$(NuGetPackageRoot)microsoft.entityframeworkcore\7.0.16\buildTransitive\net6.0\Microsoft.EntityFrameworkCore.props" Condition="Exists('$(NuGetPackageRoot)microsoft.entityframeworkcore\7.0.16\buildTransitive\net6.0\Microsoft.EntityFrameworkCore.props')" />
</ImportGroup>
</Project>

View File

@@ -1,9 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ImportGroup Condition=" '$(TargetFramework)' == 'net7.0' AND '$(ExcludeRestorePackageImports)' != 'true' ">
<Import Project="$(NuGetPackageRoot)microsoft.extensions.logging.abstractions\7.0.0\buildTransitive\net6.0\Microsoft.Extensions.Logging.Abstractions.targets" Condition="Exists('$(NuGetPackageRoot)microsoft.extensions.logging.abstractions\7.0.0\buildTransitive\net6.0\Microsoft.Extensions.Logging.Abstractions.targets')" />
</ImportGroup>
<ImportGroup Condition=" '$(TargetFramework)' == 'net8.0' AND '$(ExcludeRestorePackageImports)' != 'true' ">
<Import Project="$(NuGetPackageRoot)microsoft.extensions.logging.abstractions\7.0.0\buildTransitive\net6.0\Microsoft.Extensions.Logging.Abstractions.targets" Condition="Exists('$(NuGetPackageRoot)microsoft.extensions.logging.abstractions\7.0.0\buildTransitive\net6.0\Microsoft.Extensions.Logging.Abstractions.targets')" />
</ImportGroup>
</Project>

View File

@@ -1,4 +0,0 @@
// <autogenerated />
using System;
using System.Reflection;
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v7.0", FrameworkDisplayName = ".NET 7.0")]

View File

@@ -1,13 +0,0 @@
is_global = true
build_property.TargetFramework = net7.0
build_property.TargetPlatformMinVersion =
build_property.UsingMicrosoftNETSdkWeb =
build_property.ProjectTypeGuids =
build_property.InvariantGlobalization =
build_property.PlatformNeutralAssembly =
build_property.EnforceExtendedAnalyzerRules =
build_property._SupportedPlatformList = Linux,macOS,Windows
build_property.RootNamespace = DigitalData.Core.Infrastructure
build_property.ProjectDir = E:\TekH\Visual Studio\WebCoreModules\DigitalData.Core.Infrastructure\
build_property.EnableComHosting =
build_property.EnableGeneratedComInterfaceComImportInterop =

View File

@@ -1,8 +0,0 @@
// <auto-generated/>
global using global::System;
global using global::System.Collections.Generic;
global using global::System.IO;
global using global::System.Linq;
global using global::System.Net.Http;
global using global::System.Threading;
global using global::System.Threading.Tasks;

View File

@@ -1,11 +1,10 @@
using System.Security.Claims;
namespace DigitalData.Core.Security.Config
{
public class ClaimDescriptor<TPrincipal>
{
public Func<TPrincipal, IDictionary<string, object>>? CreateClaims { get; init; }
namespace DigitalData.Core.Security.Config;
public Func<TPrincipal, ClaimsIdentity>? CreateSubject { get; init; }
}
public class ClaimDescriptor<TPrincipal>
{
public Func<TPrincipal, IDictionary<string, object>>? CreateClaims { get; init; }
public Func<TPrincipal, ClaimsIdentity>? CreateSubject { get; init; }
}

View File

@@ -1,104 +0,0 @@
using DigitalData.Core.Security.RSAKey;
namespace DigitalData.Core.Security.Config
{
public class CryptoFactoryParams : RSAFactoryParams
{
public string PemDirectory { get; init; } = string.Empty;
/// <summary>
/// Represents the separator used to concatenate the components of a file-related token string.
/// </summary>
/// <remarks>
/// The resulting file-related token string is constructed as follows:
/// <c>string.Join(FileNameSeparator, Issuer, Audience, Secret_version)</c>.
/// If <c>Secret_version</c> is not null, it will be included in the concatenation.
/// </remarks>
/// <example>
/// For example, if <c>FileNameSeparator = "_-_"</c>, the output might look like:
/// <c>"Issuer_-_Audience_-_Secret_version"</c>.
/// </example>
public string FileNameSeparator { get; init; } = "_-_";
public string FileExtension { get; init; } = "pem";
/// <summary>
///This is the subtext of the pem file name. For the file to be automatically renewed, the name must be assigned to change periodically. For example, by default MM/2 will be refreshed every 2 months.
/// <br />
/// - <see cref="StringExtensions.ToTag(DateTime, string)" /> is used when converting to tag.
/// <br />
/// - If the format contains the symbol “//”, the method divides the numeric value obtained from the left side of the format
/// by one minus the numeric value obtained from the right side of the format string and adds one. For instance:
/// <br />
/// - If the date is 02.03.2024 and the format is "MM//2", it extracts the month (02), subtracts one (3), divides it by 2,
/// rounds down the outgoing number (1), adds one to the number (resulting in 2).
/// <br />
/// - If the format does not contain "//", the method uses the default <see cref="DateTime.ToString"/> format.
/// <br />
/// This method provides a way to format the date based on typical or customized rules, including mathematical operations like division.
/// </summary>
public string DateTagFormat { get; init; } = "MM//2";
public IEnumerable<RSADecryptor> Decryptors { get; init; } = new List<RSADecryptor>();
public IEnumerable<RSATokenDescriptor> TokenDescriptors { get; init; } = new List<RSATokenDescriptor>();
public RSADecryptor? VaultDecryptor { get; init; }
public CryptoFactoryParams()
{
// init decryptors
AfterCreate += () =>
{
// Create root folder if it does not exist
if (!Directory.Exists(PemDirectory))
Directory.CreateDirectory(PemDirectory);
var privateKeys = new List<RSAPrivateKey>();
privateKeys.AddRange(Decryptors);
privateKeys.AddRange(TokenDescriptors);
if (VaultDecryptor is not null)
privateKeys.Add(VaultDecryptor);
foreach (var privateKey in privateKeys)
{
// set default path
if (privateKey.IsPemNull)
{
// file name
var file_name_params = new List<object>();
if (privateKey.Id is not null)
file_name_params.Add(privateKey.Id);
else if (privateKey is RSATokenDescriptor descriptor)
file_name_params.Add(descriptor.Issuer);
file_name_params.Add(KeySizeInBits);
file_name_params.Add(DateTime.Now.ToTag(DateTagFormat));
if (privateKey.IsEncrypted)
file_name_params.Add(Secrets.Version);
var file_name = $"{string.Join(FileNameSeparator, file_name_params)}.{FileExtension}";
var path = Path.Combine(PemDirectory, file_name);
if (File.Exists(path))
privateKey.SetPem(File.ReadAllText(path));
else
{
var pem = privateKey.IsEncrypted
? Instance.RSAFactory.CreateEncryptedPrivateKeyPem(pbeParameters: PbeParameters, keySizeInBits: KeySizeInBits, password: Secrets.PBE_PASSWORD)
: Instance.RSAFactory.CreatePrivateKeyPem(keySizeInBits: KeySizeInBits);
privateKey.SetPem(pem);
// Save file in background
Task.Run(async () => await File.WriteAllTextAsync(path: path, pem));
}
}
}
};
}
}
}

View File

@@ -1,14 +1,13 @@
using AutoMapper;
using DigitalData.Core.Abstractions.Security;
using DigitalData.Core.Abstractions.Security.Key;
using Microsoft.IdentityModel.Tokens;
namespace DigitalData.Core.Security.Config
namespace DigitalData.Core.Security.Config;
public class MappingProfile : Profile
{
public class MappingProfile : Profile
public MappingProfile()
{
public MappingProfile()
{
CreateMap<IAsymmetricTokenDescriptor, SecurityTokenDescriptor>();
}
CreateMap<IAsymmetricTokenDescriptor, SecurityTokenDescriptor>();
}
}

View File

@@ -1,9 +0,0 @@
using Microsoft.Extensions.Options;
namespace DigitalData.Core.Security.Config
{
public class ParamsConfigureOptions<TParams> : IConfigureOptions<TParams> where TParams : RSAFactoryParams
{
public void Configure(TParams options) => options.Init();
}
}

View File

@@ -1,59 +0,0 @@
using System.Reflection;
using System.Security.Cryptography;
using System.Text.Json.Serialization;
namespace DigitalData.Core.Security.Config
{
public class RSAFactoryParams : IJsonOnDeserialized
{
public int KeySizeInBits { get; init; } = 2048;
public string PbePassword { internal get; init; } = Secrets.PBE_PASSWORD;
public PbeEncryptionAlgorithm PbeEncryptionAlgorithm { get; init; } = PbeEncryptionAlgorithm.Aes256Cbc;
public HashAlgorithmName PbeHashAlgorithm { get; init; } = HashAlgorithmName.SHA256;
// TODO: add as json converter to IConfigurIConfiguration.Config
public string PbeHashAlgorithmName
{
get => PbeHashAlgorithm.ToString();
init => PbeHashAlgorithm = (typeof(HashAlgorithmName).GetProperty(value, BindingFlags.Public | BindingFlags.Static)?.GetValue(null) is HashAlgorithmName hashAlgorithmName)
? hashAlgorithmName
: new(value);
}
public int PbeIterationCount { get; init; } = 100_000;
public string EncryptedPrivateKeyPemLabel { get; init; } = "ENCRYPTED PRIVATE KEY";
private PbeParameters? _pbeParameters;
[JsonIgnore]
public PbeParameters PbeParameters => _pbeParameters!;
/// <summary>
/// Provides a thread-safe initialization mechanism using Lazy initialization.
/// </summary>
private readonly Lazy<bool> _lazyInitializer;
public bool IsInitialized => _lazyInitializer.IsValueCreated;
public RSAFactoryParams()
{
_lazyInitializer = new(() =>
{
AfterCreate?.Invoke();
return true;
});
AfterCreate += () => _pbeParameters = new PbeParameters(PbeEncryptionAlgorithm, PbeHashAlgorithm, PbeIterationCount);
}
protected event Action AfterCreate;
public void Init() => _ = _lazyInitializer.Value;
public void OnDeserialized() => Init();
}
}

View File

@@ -0,0 +1,94 @@
using DigitalData.Core.Security.RSAKey.Auth;
using DigitalData.Core.Security.RSAKey.Crypto;
using System.Reflection;
using System.Security.Cryptography;
namespace DigitalData.Core.Security.Config;
public class RSAParams
{
#region Factory Params
public int KeySizeInBits { get; init; } = Default.KeySizeInBits;
public string PbePassword { internal get; init; } = Default.PbePassword;
public PbeEncryptionAlgorithm PbeEncryptionAlgorithm { get; init; } = Default.PbeEncryptionAlgorithm;
public HashAlgorithmName PbeHashAlgorithm { get; init; } = Default.PbeHashAlgorithm;
// TODO: add as json converter to IConfigurIConfiguration.Config
public string PbeHashAlgorithmName
{
get => PbeHashAlgorithm.ToString();
init => PbeHashAlgorithm = (typeof(HashAlgorithmName).GetProperty(value, BindingFlags.Public | BindingFlags.Static)?.GetValue(null) is HashAlgorithmName hashAlgorithmName)
? hashAlgorithmName
: new(value);
}
public int PbeIterationCount { get; init; } = Default.PbeIterationCount;
public string EncryptedPrivateKeyPemLabel { get; init; } = Default.EncryptedPrivateKeyPemLabel;
public PbeParameters PbeParameters => new(PbeEncryptionAlgorithm, PbeHashAlgorithm, PbeIterationCount);
public static class Default
{
public static readonly int KeySizeInBits = 2048;
public static readonly string PbePassword = Secrets.PBE_PASSWORD;
public static readonly PbeEncryptionAlgorithm PbeEncryptionAlgorithm = PbeEncryptionAlgorithm.Aes256Cbc;
public static readonly HashAlgorithmName PbeHashAlgorithm = HashAlgorithmName.SHA256;
public static readonly int PbeIterationCount = 100_000;
public static readonly string EncryptedPrivateKeyPemLabel = "ENCRYPTED PRIVATE KEY";
public static readonly PbeParameters PbeParameters = new(PbeEncryptionAlgorithm, PbeHashAlgorithm, PbeIterationCount);
}
#endregion
#region Pool Params
public string PemDirectory { get; init; } = string.Empty;
/// <summary>
/// Represents the separator used to concatenate the components of a file-related token string.
/// </summary>
/// <remarks>
/// The resulting file-related token string is constructed as follows:
/// <c>string.Join(FileNameSeparator, Issuer, Audience, Secret_version)</c>.
/// If <c>Secret_version</c> is not null, it will be included in the concatenation.
/// </remarks>
/// <example>
/// For example, if <c>FileNameSeparator = "_-_"</c>, the output might look like:
/// <c>"Issuer_-_Audience_-_Secret_version"</c>.
/// </example>
public string FileNameSeparator { get; init; } = "_-_";
public string FileExtension { get; init; } = "pem";
/// <summary>
///This is the subtext of the pem file name. For the file to be automatically renewed, the name must be assigned to change periodically. For example, by default MM/2 will be refreshed every 2 months.
/// <br />
/// - <see cref="StringExtensions.ToTag(DateTime, string)" /> is used when converting to tag.
/// <br />
/// - If the format contains the symbol “//”, the method divides the numeric value obtained from the left side of the format
/// by one minus the numeric value obtained from the right side of the format string and adds one. For instance:
/// <br />
/// - If the date is 02.03.2024 and the format is "MM//2", it extracts the month (02), subtracts one (3), divides it by 2,
/// rounds down the outgoing number (1), adds one to the number (resulting in 2).
/// <br />
/// - If the format does not contain "//", the method uses the default <see cref="DateTime.ToString"/> format.
/// <br />
/// This method provides a way to format the date based on typical or customized rules, including mathematical operations like division.
/// </summary>
public string DateTagFormat { get; init; } = "MM//2";
public IEnumerable<RSADecryptor> Decryptors { get; init; } = new List<RSADecryptor>();
public IEnumerable<RSATokenDescriptor> TokenDescriptors { get; init; } = new List<RSATokenDescriptor>();
public RSADecryptor? VaultDecryptor { get; init; }
#endregion
}

View File

@@ -1,38 +0,0 @@
using DigitalData.Core.Abstractions.Security;
using DigitalData.Core.Security.Config;
using DigitalData.Core.Security.RSAKey;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
namespace DigitalData.Core.Security
{
public class CryptoFactory : RSAFactory<CryptoFactoryParams>, ICryptoFactory, IAsymmetricKeyFactory
{
public IEnumerable<IAsymmetricDecryptor> Decryptors { get; }
/// <summary>
/// It is a separate decryptor for permanently stored encrypted data. It is assigned to the first Default decryptor by default.
/// </summary>
public IAsymmetricDecryptor VaultDecryptor { get; }
public IEnumerable<IAsymmetricTokenDescriptor> TokenDescriptors { get; init; } = new List<IAsymmetricTokenDescriptor>();
public CryptoFactory(IOptions<CryptoFactoryParams> options, ILogger<CryptoFactory>? logger = null) : base(options)
{
logger?.LogInformation("Core.Secrets version: {Version}, Created on: {CreationDate}.", Secrets.Version, Secrets.CreationDate.ToString("dd.MM.yyyy"));
if (!_params.Decryptors.Any())
throw new InvalidOperationException(
"Any decryptor is not found. Ensure that at least one decryptor is configured in the provided parameters. " +
"This issue typically arises if the configuration for decryptors is incomplete or missing. " +
"Check the 'Decryptors' collection in the configuration and verify that it contains valid entries."
);
Decryptors = _params.Decryptors;
TokenDescriptors = _params.TokenDescriptors;
VaultDecryptor = _params.VaultDecryptor ?? Decryptors.First();
}
}
}

Some files were not shown because too many files have changed in this diff Show More