276 Commits

Author SHA1 Message Date
Developer 02
ad8d15314f chore(Security): Description fixed 2025-01-14 20:20:25 +01:00
Developer 02
f1efbae6a4 feat(Sicherheit): Paketdefinition hinzugefügt. 2025-01-14 20:14:59 +01:00
Developer 02
051567aa0a refactor(Abstraktionen): hochgestuft auf 3.1 2025-01-14 19:51:58 +01:00
Developer 02
287871ddc6 refactor(TokenDescriptor): ApiRoute-Eigenschaft entfernt 2025-01-14 19:45:44 +01:00
Developer 02
a0ad8d732d refactor(RSATokenDescriptor): Lifetime-Eigenschaft hinzugefügt 2025-01-14 17:04:54 +01:00
Developer 02
3ad08e2a86 feat(AsymmetricTokenValidator): SecurityKey-Eigenschaft hinzugefügt. 2025-01-13 09:52:52 +01:00
Developer 02
b90a52412c feat(IAsymmetricTokenDescriptor): Methode Validator.get mit Lazy Loading hinzugefügt. 2025-01-10 23:32:53 +01:00
Developer 02
39091ff5cf refactor(IAsymmetricKey): Id nullbar gemacht.
- Benennung der perm-Datei aktualisiert.
2025-01-10 15:47:02 +01:00
Developer 02
22040cf1e7 fix(CryptoFactoryParams): Die Zuweisung des Standard-Depotnamens wurde unter das Ereignis afterCreate verschoben. 2025-01-09 23:59:58 +01:00
Developer 02
af4b7d5438 fix(CryptoFactoryParams): Aktualisiert, um den ersten Decryptor zu verwenden, um die Standard-Depot-ID zu setzen. 2025-01-09 23:39:42 +01:00
Developer 02
211064d44e refactor(RSATokenDescriptor): Standard-Id mit Issuer und Audience hinzugefügt.
- Issuer und Audience erforderlich gemacht.
2025-01-09 23:25:17 +01:00
Developer 02
66e3c771dd refactor(IAsymmetricKey): Die Implementierung von IUniqueSecurityContext wurde entfernt und stattdessen die Eigenschaft Id hinzugefügt.
- Aktualisierte verwandte Implementierungen.
2025-01-09 22:57:04 +01:00
Developer 02
97c4f7bf8f refactor(CryptographParams): umbenannt in CryptoFactoryParams 2025-01-09 22:33:56 +01:00
Developer 02
5981ba7a8d refactor(Abstractions.Security): Unnötige public Schlüsselwörter in Schnittstellen entfernt. 2025-01-09 22:27:33 +01:00
Developer 02
21e164ceb7 refactor(IAsymmetricKey): Unnötige Initor-Methoden entfernt. 2025-01-09 22:15:45 +01:00
Developer 02
1875bf46fa feat(DIExtensions): Umbenennung der AddCryptograph-Methoden in AddCryptoFactory 2025-01-09 20:38:15 +01:00
Developer 02
7f9459f6cf feat(SecurityExtensions): Erforderliche WriteToken-Methoden über Erweiterungen anstelle der Schnittstellenimplementierung hinzugefügt 2025-01-09 20:30:38 +01:00
Developer 02
079f0c69c7 fix(Kryptograph): Umbenannt in Krypto-Fabrik. 2025-01-09 20:10:45 +01:00
Developer 02
d98b3f2867 fix(JwtSignatureHandler): Aktualisierte Methoden, um IAsymmetricTokenDescriptor verwenden zu können 2025-01-09 19:54:05 +01:00
Developer 02
3761c13dba refactor(ICryptograph): Eigenschaft „TokenDescriptors“ hinzugefügt. 2025-01-09 19:34:29 +01:00
Developer 02
8acbbaeb2e refactor(IAsymmetricTokenDescriptor): Erforderliche Proportionen für SecurityTokenDescriptor-Zuordnung hinzugefügt. 2025-01-09 19:16:56 +01:00
Developer 02
60e1ec78b3 refactor(Kryptograph): Entfernte Verschlüsselungen. 2025-01-09 18:52:59 +01:00
Developer 02
e623575fe8 refactor(Kryptograph): Aktualisiert, um TokenDescriptors aus CryptographParams hinzuzufügen. 2025-01-09 18:33:51 +01:00
Developer 02
60ae8de550 refactor(CryptographParams): Aktualisierung, um TokenDeskriptoren mit Decryptoren zu initialisieren 2025-01-09 18:28:20 +01:00
Developer 02
87ad45f42a refactor(RSATokenDescriptor): Die Klasse RSA Token Descriptor wurde erstellt und die Funktionen wurden dorthin verschoben, um eine einfache und saubere Konfiguration zu ermöglichen. 2025-01-09 17:59:13 +01:00
Developer 02
2557525f06 refactor(PrivateKeyTokenDescriptor): superwarning zur Deaktivierung der Warnung vor Null 2025-01-09 11:08:06 +01:00
Developer 02
7a938f0379 refactor(Privatekey): Die Klasse encryptor wurde erstellt und die Verschlüsselungsfunktionen wurden zur einfachen und sauberen Konfiguration dorthin verschoben. 2025-01-08 20:03:25 +01:00
Developer 02
9f0facc487 refactor(Privatekey): Die Klasse decryptor wurde erstellt und die Verschlüsselungsfunktionen für eine einfache und saubere Konfiguration dorthin verschoben. 2025-01-08 18:45:36 +01:00
Developer 02
608d266d1c refactor(IAsymmetricKey): Umwandlung von RsaSecurityKey in SecurityKey zur besseren Abstraktion.
- RSAEncryptionPadding entfernen
 - Pem als Inhalt Content
2025-01-07 16:53:05 +01:00
Developer 02
34e14fd2f5 refactor(RSATokenDescriptor): In die Abstraktionsschicht verschoben und in PrivateKeyTokenDescriptor umbenannt 2025-01-07 16:34:19 +01:00
Developer 02
dc45cf2c08 refactor(JwtSignatureHandler): Aktualisiert, um RSAPrivateKey anstelle des Deskriptors zu verwenden 2025-01-07 13:55:30 +01:00
Developer 02
09a31b5a3d refactor(TokenDescription): Nach RSAKey verschoben, um unter RSAPrivateKey definiert werden zu können 2025-01-07 13:22:45 +01:00
Developer 02
b5cecac745 refactor(DIExtensions): Umbenennung der Methode AddAsymCryptHandler in AddCryptograph 2025-01-07 12:19:42 +01:00
Developer 02
0f4b5430a3 refactor(AsymCryptParams): Umbenennen in CryptographParams. 2025-01-07 12:12:50 +01:00
Developer 02
7f2d2dadfa refactor(DigitalData.Core.Security): Umbenennung des Unternamensraums von Cryptographer in RSAKey 2025-01-07 12:09:34 +01:00
Developer 02
ac0b6f739b refactor(AsymCryptHandler): Renamed to Cryptograph 2025-01-07 12:03:01 +01:00
Developer 02
d9d61368e3 refactor(IAsymCryptHandler): Umbenannt in ICryptograph 2025-01-07 12:01:39 +01:00
Developer 02
e8c98115b6 refactor(IRSAFactory): umbenannt in IAsymmetricKey 2025-01-07 11:48:27 +01:00
Developer 02
09dae1b1ac refactor(IRSAEncryptor): umbenannt in RSAPublicKey 2025-01-07 11:39:12 +01:00
Developer 02
9aafc9e467 refactor(IRSAEncryptor): umbenannt in IAsymmetricPublicKey 2025-01-07 11:33:53 +01:00
Developer 02
4ce738957d refactor(RSADecryptor): umbenennen in RSAPrivateKey 2025-01-07 11:20:24 +01:00
Developer 02
5e1bf16b6d refactor(IRSADecryptor): Umbenennung in IAsymmetricPrivateKey 2025-01-07 11:16:12 +01:00
Developer 02
4f96d271f3 refactor(IRSACryptographer): Umbenennung in IAsymmetricKey 2025-01-07 11:03:14 +01:00
Developer 02
14485af448 fix(DIExtensions): Umbenennung der Methode AddAsymCryptService in AddAsymCryptHandler 2025-01-07 10:38:10 +01:00
Developer 02
c27e21a702 fix(JwtSignatureHandler): The nullability of TokenParams has been removed. 2025-01-07 10:36:17 +01:00
Developer 02
4874079b69 fix: TokenParams-Kaliber erstellt, um Token-Beschreibungen über IOptions zu konfigurieren 2025-01-07 10:21:25 +01:00
Developer 02
15e909064f feat(IJwtSignatureHandler): Unterstützung für die Erstellung von Token durch den Routenwert der Tokenbeschreibung hinzugefügt. 2025-01-07 09:35:09 +01:00
Developer 02
d17c5ca6cd feat(JwtSignatureHandler): Unterstützung für die Erstellung von Token durch den Routenwert der Tokenbeschreibung hinzugefügt. 2025-01-07 09:30:33 +01:00
Developer 02
592b949f57 feat: Unterstützung für Token-Beschreibungen im JwtSignatureHandler hinzugefügt
- Methoden eingeführt, um Token-Beschreibungen im DI-Container zu konfigurieren und zu registrieren.
- Überladungen zu `AddJwtSignatureHandler` hinzugefügt, um sowohl konfigurationsbasierte als auch Inline-Token-Beschreibungen zu unterstützen.
2025-01-06 16:32:32 +01:00
Developer 02
8850ac4ac9 refactor(DIExtensions): Methode AddJwtSignatureHandler hinzugefügt 2025-01-06 16:08:45 +01:00
Developer 02
8ccf6f31ae refactor(JwtSignatureHandler): Umbenennung von CreateAndWriteToken in WriteToken 2025-01-06 15:35:51 +01:00
Developer 02
9875d023e3 Revert "refactor(TokenDescription): In die Abstraktionsschicht verschoben."
This reverts commit 2cf0eb3977.
2025-01-06 15:31:26 +01:00
Developer 02
62afba7c23 refactor: Entfernen redundanter Methodenüberladungen in IJwtSignatureHandler
- Entfernte doppelte Methodensignaturen für CreateToken und CreateAndWriteToken, die TokenDescription akzeptieren.
- Vereinfachte das Interface, um sich auf die wesentlichen Methoden für die Token-Erstellung und -Schreibung zu konzentrieren.
2025-01-06 15:26:31 +01:00
Developer 02
1d4882cfbc refactor(JwtSignatureService): umbenannt in JwtSignatureHandler.
- seine Schnittstelle umbenannt
2025-01-06 15:15:46 +01:00
Developer 02
275b9ec858 feat(IJwtSignatureService): Erstellt und implementiert 2025-01-06 15:06:31 +01:00
Developer 02
2cf0eb3977 refactor(TokenDescription): In die Abstraktionsschicht verschoben. 2025-01-06 14:39:45 +01:00
Developer 02
4ab5393deb refactor(JwtSignatureService): Injizieren von IAsymCryptHandler anstelle von AsymCryptHandler zur Abstraktion. 2025-01-06 13:13:57 +01:00
Developer 02
a2dc59d5ef refactor(AsymCryptParams): Entfernte TokenDescriptions 2025-01-06 13:11:05 +01:00
Developer 02
ed041bf7cb refactor(JwtSignatureService): CreateToken und CreateAndWriteToken Methoden mit Issuer und Audience Inputs hinzugefügt 2025-01-06 12:13:41 +01:00
Developer 02
c70327e7f4 refactor(IRSADecryptor): Methode CreateSigningCredentials hinzugefügt 2025-01-06 11:32:17 +01:00
Developer 02
0a3ce89c0d refactor(IRSACryptographer): RsaSecurityKey-Eigenschaft hinzugefügt 2025-01-06 11:29:19 +01:00
Developer 02
389d64c25d refactor(AsymCryptService): umbenannt in AsymCryptHandler 2025-01-06 10:44:03 +01:00
Developer 02
a3931414e3 refactor(AsymCryptService): Indexer und IEnumerable-Implementierung zur Vereinfachung entfernt 2024-12-21 10:10:50 +01:00
Developer 02
0dd897625a feat(SecurityExtensions): Die Match- und TryMatch-Erweiterungsmethoden wurden hinzugefügt, um die Funktionalität in SecurityExtensions zu erweitern. Diese Methoden vereinfachen das Matching von IUniqueSecurityContext durch direkte Verwendung eines Lookup-Kontexts. 2024-12-20 23:34:21 +01:00
Developer 02
351a6732cf refactor(SecurityExtensions): Nullbarkeit des out-Wertes in der TryGet-Methode wurde entfernt.
- Warnung ist deaktiviert.
 - Null-Prüfung in der Verwendung entfernt.
2024-12-20 22:59:21 +01:00
Developer 02
5a1808c6a6 refactor(CryptographerExtensions): Aktualisiert zur Verwendung von IUniqueSecurityContext anstelle von IRSACryptographer.
- umbenannt in SecurityExtensions.
2024-12-20 18:54:33 +01:00
Developer 02
50c42e9cdd rename(ISecurityIdentifier): Umbenannt in IUniqueSecurityContext und Kommentare zur Dokumentation hinzugefügt. 2024-12-20 14:42:07 +01:00
Developer 02
ec126be2aa feat(ISecurityIdentifier): Implementiert in IRSACryptographer und TokenDescription 2024-12-20 14:35:10 +01:00
Developer 02
9953bbd2ef feat(ISecurityIdentifier): Wird als Basisbezeichner in den Sicherheitsklassen erstellt. 2024-12-20 14:11:16 +01:00
Developer 02
dbecfa92f4 refactor(Extension): Zusammenlegung der Erweiterungsklassen zur Vereinfachung.
- Methoden und Klasse intern gemacht, um Komplexität zu vermeiden.
2024-12-20 10:48:37 +01:00
Developer 02
e007f15bce refactor(JwtSignatureService): removed primary constructor because this feature is not available in C# 11.0.
- Added GlobalSuppressions to avoid editor to offer this.
2024-12-20 10:40:35 +01:00
Developer 02
79dffef528 Refactor: Entfernung der generischen IRSAFactory und IAsymCryptService.
- RSAFactory und AsymCryptService aktualisiert.
 - Aktualisierte DI-Erweiterungen
2024-12-20 10:30:12 +01:00
Developer 02
af478e974c refactor(TokenDescriptorProvider): entfernt und eine Mapper-Erweiterungsmethode mit derselben Funktionalität zur Vereinfachung hinzugefügt. 2024-12-20 09:44:04 +01:00
Developer 02
435c91955c refactor(JwtSignatureService): verwendete primäre Struktur. 2024-12-20 09:29:49 +01:00
Developer 02
4142d2d948 refactor(TokenDescriptorProvider): verwendete Primärstruktur. 2024-12-20 09:27:08 +01:00
Developer 02
06260e0edb feat(JwtSignatureService): Erstellt mit grundlegender Funktionalität, um mit Token Beschreibung erstellen zu können. 2024-12-20 01:51:48 +01:00
Developer 02
2d675a16ad feat(TokenDescriptorProvider): Erstellt, um eine beliebige TokenDescription auf SecurityTokenDescriptor abzubilden. 2024-12-20 01:42:23 +01:00
Developer 02
5469b20e4f feat(AsymCryptParams): AfterCreate Ereignis für TokenDescriptions hinzugefügt.
- Eigenschaften SigningCredentials, SigningAlgorithm und SigningDigest zu TokenDescription hinzugefügt.
2024-12-20 01:16:56 +01:00
Developer 02
6f5b4efefb feat(ClaimDescriptor): Erstellt, um claimsMapper und subjectMapper von TPrincipal für SecurityTokenDescriptor zu registrieren.
- DI-Erweiterungsmethode erstellt.
2024-12-20 00:48:55 +01:00
Developer 02
b6b12c7702 feat(MappingProfile): Mapping-Profil hinzugefügt, um TokenDescription in SecurityTokenDescriptor über AutoMapper zu konvertieren 2024-12-20 00:11:33 +01:00
Developer 02
ce716d2bab feat(TokenDescription): Erstellt als eingeschränkte Version von SecurityTokenDescriptor als Wurzelbeschreibungen ohne Ansprüche 2024-12-20 00:08:31 +01:00
Developer 02
bf672d8b8c feat(RSADecryptor): Methode CreateSigningCredentials hinzugefügt 2024-12-19 01:53:20 +01:00
Developer 02
ed29c9f990 feat(RSACryptographer): RsaSecurityKey.get Eigenschaft mit Lazy Loading hinzugefügt 2024-12-19 01:52:00 +01:00
Developer 02
66ed34b664 refactor(StringExtensions): Fehlermeldungen wurden ausgearbeitet und der falsche Variablenname „mode“ wurde in „divisor“ umbenannt. 2024-12-18 18:19:17 +01:00
Developer 02
d7b4c382cd fix(StringExtensions): Die Hauptformel der ToTag-Methode wurde von (x / y) in [(x - 1) / y + 1] geändert, um korrekt zu gruppieren.
- Aktualisierte Dokumentationskommentare
2024-12-18 18:10:52 +01:00
Developer 02
4f6ca3524a feat(AsymCryptParams): DateTagFormat als Subtext des Dateinamens für die periodische Aktualisierung von pem-Dateien hinzugefügt. 2024-12-18 17:51:02 +01:00
Developer 02
bd1ae4246d refactor(Extensoin): entfernt, um die Projektanzahl zu minimieren. 2024-12-18 14:09:53 +01:00
Developer 02
d92475c230 feat: Indexer hinzugefügt, um RSA-Dechiffrierer über den Index im AsymCryptService zuzugreifen
- Neuer Indexer eingeführt, um den Zugriff auf Dechiffrierer über den Index zu ermöglichen und so flexibleren Zugriff auf Elemente in der Decryptors-Sammlung zu bieten.
- Validierung der Indexgrenzen hinzugefügt, um eine ArgumentOutOfRangeException zu werfen, wenn ein ungültiger Index angegeben wird.
- Bestehende Funktionalität zum Zugriff auf Dechiffrierer über den Schlüssel beibehalten.
2024-12-18 14:05:31 +01:00
Developer 02
15705cccc4 feat(AsymCryptParams): Schlüsselgröße zum Parameter Dateiname hinzugefügt 2024-12-18 13:45:51 +01:00
Developer 02
a8403087f6 feat(DIExtensions): Die Methode AddCryptographerConverter wurde entfernt. 2024-12-18 13:17:18 +01:00
Developer 02
0235c83075 feat(RSAFactoryParams): Umbenennung von PbeHashAlgorithmName in PbeHashAlgorithm und Hinzufügen von String-Proportionen mit dem Namen von PbeHashAlgorithmName.
- PbeHashAlgorithmName.init Methoden hinzugefügt, um zu versuchen, PbeHashAlgorithm mit Reflection zu initialisieren. Wenn er null ist, wird er nach dem Namen generiert.
- PbeHashAlgorithmName.get hinzugefügt, um den Namen von PbeHashAlgorithm zu erhalten.
2024-12-18 13:04:15 +01:00
Developer 02
63aeba982f feat(RSACryptographer): Eigenschaft PaddingName hinzugefügt, um Padding mit dem Namen RSAEncryptionPadding zu initialisieren. 2024-12-18 11:36:45 +01:00
Developer 02
514495fc8d refactor: Aktualisierung der String-Verschlüsselungsmethoden in RSAEncryptor
- `Encrypt`-Methode überarbeitet, um `ToBytes` und `ToBase64String` für Konsistenz und bessere Lesbarkeit zu verwenden.
- Parametername in der Methode `Encrypt(string)` von `data` zu `strData` geändert, um die Verständlichkeit zu verbessern.
2024-12-17 20:49:34 +01:00
Developer 02
9752fb14ec fix: Unterdrückung der Nullable-Warnung für den Pem-Getter in RSADecryptor
- CS8603-Warnung für den `Pem`-Getter in `RSADecryptor` mit `#pragma warning disable/restore` unterdrückt.
- Konsistentes Verhalten sichergestellt, ohne die Laufzeitlogik zu ändern.
2024-12-17 15:29:28 +01:00
Developer 02
b3629661a1 fix(AsymCryptParams): Dateinamenerweiterung hinzugefügt. 2024-12-17 14:06:09 +01:00
Developer 02
f38bad8531 refactor(gitignore): ignored Tests.API 2024-12-16 18:07:47 +01:00
Developer 02
154478c318 feat(ParamsConfigureOptions): Erstellt, um nach der Konfiguration über appsettings initialisiert zu werden.
- DI Extension Methoden wurden entsprechend bearbeitet.
2024-12-16 17:20:40 +01:00
Developer 02
155eb563d1 feat: Lazy-Initialisierung für threadsichere RSAFactoryParams-Initialisierung hinzugefügt
- Lazy-Initialisierungsmechanismus für threadsichere Handhabung der _pbeParameters eingeführt.
- IsInitialized-Eigenschaft hinzugefügt, um den Initialisierungsstatus zu verfolgen.
- Konstruktor geändert, um das Lazy-Objekt zu initialisieren und das AfterCreate-Ereignis auszulösen.
- Sichergestellt, dass die OnDeserialized-Methode Init aufruft, um das Objekt korrekt zu initialisieren.
2024-12-16 16:37:48 +01:00
Developer 02
4aacc3f650 feat(AsymCryptService): Vault.get RSADecryptor hinzugefügt
- Optionen aktualisiert, um Vault-Parameter hinzufügen zu können. Wenn es null ist, ist Vault der erste Entschlüsseler.
 - Standard-Entschlüssler entfernt.
2024-12-16 12:56:30 +01:00
Developer 02
f40c86ed63 feat: Erweiterung des IAsymCryptService-Interfaces um zusätzliche Verschlüsselungs- und Entschlüsselungsfunktionen
- Hinzugefügt: `IEnumerable<IRSADecryptor>` und `IEnumerable<IRSAEncryptor>` zum `IAsymCryptService`-Interface.
- Einführung einer `Default`-Eigenschaft für den einfachen Zugriff auf einen Standard-Entschlüsseler.
- Aktualisierung des `IAsymCryptService`-Interfaces zur Unterstützung sowohl von Entschlüsselungs- als auch Verschlüsselungsfunktionen.
2024-12-16 11:41:52 +01:00
Developer 02
b32f0df125 refactor(AsymCryptService): Methode Default.get hinzugefügt, um den ersten Decryptor zu erhalten.
- Wirft InvalidOperationException, wenn kein Decryptor verfügbar ist.
2024-12-16 10:54:48 +01:00
Developer 02
324a5bdb1e refactor(RSAFactory): isEncrypted-Eingang von CreateDecryptor umbenennen in encrypt. 2024-12-16 10:51:46 +01:00
Developer 02
e0a6787a87 feat(RSAFactory): Unterstützung für die Erstellung von RSA-Decryptors hinzugefügt
- Methode `CreateDecryptor` hinzugefügt, um die Erstellung von `IRSADecryptor`-Instanzen zu vereinfachen.
- Stellt sicher, dass Decryptors mit PEM, Aussteller, Empfänger, Verschlüsselungsstatus und Padding-Einstellungen initialisiert werden.
- Bestehende Funktionalität zur Erstellung privater und verschlüsselter privater Schlüssel beibehalten.
- Die RSA-Factory verbessert, um Workflows zur Entschlüsselung besser zu unterstützen.
2024-12-16 10:37:56 +01:00
Developer 02
c6a4038eab refactor: Umbenennung von Core.Security.Extensions in Core.Extension 2024-12-16 10:24:19 +01:00
Developer 02
58c8520c08 refactor(RSADecryptor): Verbesserung der PEM-Initialisierung und Konsistenz
- Die `Pem`-Eigenschaft aktualisiert, sodass während der Initialisierung automatisch `Init()` aufgerufen wird, um eine konsistente Einrichtung sicherzustellen.
- Die Methode `SetPem` überarbeitet, um nach dem Setzen des PEM-Werts `Init()` aufzurufen.
- Die Methode `Init()` verbessert, um null- oder leere PEM-Werte robuster zu behandeln.
- Fehlermeldungen für mehr Klarheit und bessere Debugging-Unterstützung verbessert.
- Interne RSA-Initialisierungslogik an die Verarbeitung von Verschlüsselungen angepasst.
2024-12-16 10:05:51 +01:00
Developer 02
eced1a5afc feat(RSAFactory): Optionale Verschlüsselungseingabe in CreatePrivateKeyPem Methode hinzugefügt.
- Falsch als Standard eingestellt.
2024-12-16 10:01:09 +01:00
Developer 02
7da93c6719 refactor(DIExtensions): Verbesserung der Registrierung von AsymCrypt-Diensten und Vereinfachung von Overloads
- `AddAsymCryptService` aktualisiert, um eine Standardimplementierung mit `AsymCryptParams` ohne generische Typen bereitzustellen.
- Neue Überladung von `AddAsymCryptService` hinzugefügt, die eine `IConfigurationSection` für Standardparameter akzeptiert.
- Lebensdauer der Service-Registrierungen für `IAsymCryptService` von `Scoped` auf `Singleton` geändert, um Konsistenz und geringeren Overhead zu gewährleisten.
2024-12-16 09:44:51 +01:00
Developer 02
6a92466490 feat: hinzugefügte Index-Eigenschaft zur IAsymCryptService-Schnittstelle
- Neue Index-Eigenschaft `this[string key]` zur `IAsymCryptService`-Schnittstelle hinzugefügt.
- Ermöglicht das Abrufen spezifischer `IRSADecryptor`-Instanzen anhand eines Schlüsselstrings.
- Schnittstellendefinition aktualisiert, um die Funktionalität für implementierende Klassen zu erweitern.
2024-12-13 16:59:02 +01:00
Developer 02
5d9d756b91 feat: hinzugefügte Index-Eigenschaft zur Abfrage eines spezifischen IRSADecryptor anhand eines Schlüssels
- Neue Index-Eigenschaft `this[string key]` in `AsymCryptService` eingeführt, um spezifische `IRSADecryptor`-Instanzen basierend auf Issuer- und Audience-Schlüsseln abzurufen.
- Validierung des Schlüsselformats und Fehlerbehandlung für Fälle hinzugefügt, in denen kein passender Decryptor gefunden wird.
- Implementierung aktualisiert, um die Kompatibilität mit der bestehenden Decryptor-Enumerationslogik sicherzustellen.
2024-12-13 16:57:30 +01:00
Developer 02
f14aaa75e1 refactor(AsymCryptParams): Umbenennung von Separator in FileNameSeparator.
- KeyNameSeparator hinzugefügt.
2024-12-13 16:40:00 +01:00
Developer 02
249f5a0ae5 feat(AsymCryptService): Encryptors.get hinzugefügt, um die Verschlüsseler der Entschlüsseler zu numerieren. 2024-12-13 16:34:53 +01:00
Developer 02
30177cf0c7 feat(AsymCryptService): Implementiert IEnumerable<IRSADecryptor> 2024-12-13 16:25:21 +01:00
Developer 02
68ef0a7537 refactor(RSACryptographer): Entfernen von _pem, IsPemNull, SetPem, Init und Methoden zur Vereinfachung von RSAEncryptor 2024-12-13 16:17:35 +01:00
Developer 02
fe2ee78d14 refactor(RSADecryptor): Umbenennung der Eigenschaft Encrypt in IsEncrypted 2024-12-13 16:02:25 +01:00
Developer 02
53e6f37a09 refactor(AsymCryptParams): Umbenennung von crypt in der Schleife in decryptor 2024-12-13 15:59:28 +01:00
Developer 02
7ec85b4e30 refactor(AsymCryptParams): Unnötige Methoden entfernt 2024-12-13 15:57:17 +01:00
Developer 02
a9ebc406f3 refactor(RSAFactory): Methode CreateEncryptedPrivateKeyPem hinzugefügt, um mit direkt benutzerdefinierten pbeParametern zu erstellen.
- Umbenennung der Methode CreateRSAPrivateKeyPem in CreatePrivateKeyPem
2024-12-13 15:45:09 +01:00
Developer 02
d013d3edfa refactor(AsymCryptService): Verschlüsselungen entfernen, da sie von Entschlüsselungen erzeugt werden müssen. 2024-12-13 15:38:50 +01:00
Developer 02
f267fe955b feat(AsymCryptParams): Funktionalität erstellt, um pem aus der Datei zu setzen, wenn diese null ist.
- Wenn die pem Datei nicht existiert, erstellt
2024-12-13 15:29:42 +01:00
Developer 02
644283cf8f refactor(AsymCryptService): Nicht-generische Schnittstelle erstellt.
- Geordnete DI-Registrierungsmethoden.
2024-12-13 14:44:09 +01:00
Developer 02
82aa8d1143 refactor(DIExtensions): Alle TryAddSingelton wurden in AddSingelton umgewandelt, um im Falle einer falschen Ausnahme den Fehler zu protokollieren.
- SetAsDefault-Parameter hinzugefügt, um nicht-generische IRSAFactory im Falle einer Konfiguration über appsettings registrieren zu können.
2024-12-13 14:00:43 +01:00
Developer 02
7459f05748 refactor(RSAFactory): Schaffung einer nicht-generischen, getrennten Schnittstelle, um eine statische Standardinstanz erstellen zu können.
- Statische Instanzklasse erstellt.
 - Geordnete DI-Registrierungsmethoden.
2024-12-13 13:47:44 +01:00
Developer 02
36f75d003a refactor(AsymCryptParams): Umbenennung von Directory in PemDirectory, um Namenskonflikte zu vermeiden. 2024-12-13 11:11:12 +01:00
Developer 02
76ce64691a refactor(RSACryptographer): Verzeichnis und Dateiname wurden entfernt.
- Datei-Leseprozess in init-Methode entfernt.
2024-12-13 10:29:49 +01:00
Developer 02
7c03282066 refactor(RSACryptographer): Interne Methoden zur Konfiguration von RSACryptographen hinzugefügt.
- IsPemNull.get-Methode hinzugefügt, um zu prüfen, ob _pem null ist.
 - SetPem-Methode hinzugefügt, um pem im Projekt aktualisieren zu können.
2024-12-13 10:15:22 +01:00
Developer 02
7ae95b729f Fix: Upgrade aufgrund einer Nuget-Paket-Abhängigkeit der abstrakten Schicht 2024-12-10 23:32:49 +01:00
Developer 02
9ee8a51664 chore(Abstraktionen): Aktualisiert von 2.2.1 auf 3.0.0 2024-12-10 23:28:34 +01:00
Developer 02
b1d1a898b8 chore(API): Aktualisiert von 2.0.1 auf 2.1 2024-12-10 23:20:40 +01:00
Developer 02
4ed3e79565 chore(Anwendung): Hochgestuft von 2 auf 3 2024-12-10 23:19:27 +01:00
Developer 02
8d9de4502e refactor(Application): Verbesserung der CRUDService zur Steigerung der Typflexibilität und Wartbarkeit
- Entfernen redundanter generischer Einschränkungen für `TUpdateDto` in `CRUDService`.
- Aktualisierung der Methode `UpdateAsync`, um einen generischen Parameter für eine bessere Typflexibilität von `TUpdateDto` einzuschließen.
- Verbesserung der Typ-Einschränkungen durch Durchsetzung von `IUnique<TId>` direkt im Methodenumfang, wo zutreffend.
- Vereinfachung der Klasse zur Einhaltung bewährter Praktiken im Design generischer Dienste.
2024-12-10 23:17:41 +01:00
Developer 02
7dd91c73c4 Merge branch 'feat/client' 2024-12-10 23:03:01 +01:00
Developer 02
988d1e2b16 feat(RSADecryptor): FileNotFoundEvent-Methode aktualisiert, um Datei zu erstellen, wenn nicht gefunden 2024-12-07 03:26:00 +01:00
Developer 02
4e0e907313 feat(RSAEncryptor): FileNotFoundEvent-Methode aktualisiert, um Datei zu erstellen, wenn nicht gefunden 2024-12-07 03:24:29 +01:00
Developer 02
0bfec426d4 refactor: Mergen von Encryptors und Decryptors in eine einzelne Sammlung
- Kombiniert `Encryptors` und `Decryptors` in `cryptographers` für eine vereinfachte Initialisierung in `OnDeserialized`.
2024-12-07 03:10:29 +01:00
Developer 02
08ffe821ff fix: Nullprüfungen und Initialisierung nach der Deserialisierung hinzufügen
- Nullprüfungen in `OnDeserialized` implementiert, um `Directory` und `FileName` für Decryptoren festzulegen.
- `FileName` mit `FileNameFormat` dynamisch erstellt.
- `TypeTagOf` verfeinert, um den richtigen Tag zu bestimmen, und Fehlerbehandlung für nicht unterstützte Kryptografietypen hinzugefügt.
2024-12-07 03:06:57 +01:00
Developer 02
fa5d0f1b26 refactor(IRSACryptographer): Init-Methode, Verzeichnis- und Dateinamen-Getter-Setter hinzugefügt 2024-12-07 02:09:32 +01:00
Developer 02
38bd23d012 refactor(RSAFactory): Entfernen der Methode ReadRSADecryptorAsync. 2024-12-07 02:01:06 +01:00
Developer 02
50e2581727 feat(RSACryptographer): Virtuelle UnableToInitPemEvent-Methode für den Fall hinzugefügt, dass sowohl pem als auch pem-Pfad null sein können 2024-12-07 01:33:56 +01:00
Developer 02
5c09d7775b feat(RSACryptographer): Virtuelle FileNotFoundEvent-Methode für nicht gefundene Pem-Datei hinzugefügt 2024-12-07 01:26:00 +01:00
Developer 02
dbfee49dee refactor(RSADecryptor): RSADecryptor, Version und Passwort entfernen und hinzufügen 2024-12-07 01:14:13 +01:00
Developer 02
0c6c84852d refactor: Validierung für Pem-Eigenschaft hinzugefügt, um Ausnahme bei Nicht-Initialisierung auszulösen
- Die Pem-Eigenschaft wurde aktualisiert, um eine Validierung hinzuzufügen, die eine InvalidOperationException auslöst, falls sie vor der Initialisierung aufgerufen wird.
 - Nicht verwendeten Import System.Text.Json.Serialization entfernt.
 - Fehlermeldungen wurden erweitert, um Issuer und Audience für eine bessere Debugging-Kontextbereitschaft einzuschließen.
2024-12-07 00:57:10 +01:00
Developer 02
3f61b5064c refactor(RSACryptographer): Verzeichnis- und Dateinamen-Intter in Setter umwandeln 2024-12-06 17:27:03 +01:00
Developer 02
f79d2e2352 refactor(IRSACryptographer): IJsonOnDeserialized-Implementierung entfernt 2024-12-06 17:22:42 +01:00
Developer 02
201da81aa5 refactor(RSACryptographer): anstatt PemPath.init zu verwenden, wurden getrennte Verzeichnis- und Dateinameneigenschaften hinzugefügt 2024-12-06 17:17:53 +01:00
Developer 02
bea57a25e8 feat(RSACryptographer) Init-Methode zur Verwaltung des pem-Importprozesses hinzugefügt 2024-12-06 15:12:21 +01:00
Developer 02
0ff89b4906 Reapply "refactor(RSACryptographer): Entfernte nullbare Eigenschaft von Issuer und Audience."
This reverts commit 600d17ef40.
2024-12-05 23:18:19 +01:00
Developer 02
600d17ef40 Revert "refactor(RSACryptographer): Entfernte nullbare Eigenschaft von Issuer und Audience."
This reverts commit 16565eca4d.
2024-12-05 23:08:13 +01:00
Developer 02
16565eca4d refactor(RSACryptographer): Entfernte nullbare Eigenschaft von Issuer und Audience.
- Schnittstelle aktualisiert
 - standardmäßig als leerer String zugewiesen.
2024-12-05 20:07:17 +01:00
Developer 02
8787c04917 refactor(AsymCryptParams): unnötige Eigenschaften entfernt 2024-12-05 15:50:53 +01:00
Developer 02
b3568216a0 refactor(IAsymCryptService): Indexer entfernt und Decryptors und Encryptors getter Methoden hinzugefügt. 2024-12-05 15:47:46 +01:00
Developer 02
6f520732dd refactor(AsymCryptService): Entschlüsselungswörterbuch entfernt 2024-12-05 15:22:23 +01:00
Developer 02
8003cffb9b refactor(CryptographerExtensions): In die Abstraktionsschicht verschieben 2024-12-05 15:20:56 +01:00
Developer 02
b02f93b38d refactor(RSACryptographerList): entfernt 2024-12-05 15:19:44 +01:00
Developer 02
2f0c6a905a chore: Hinzugefügtes ToDo 2024-12-05 15:03:28 +01:00
Developer 02
baf1f5e045 refactor(CryptographerExtensions): Aktualisiert, um IRSACryptographer anstelle von RSACryptographer zu verwenden, um die Abstraktion zu erhöhen. 2024-12-05 14:58:44 +01:00
Developer 02
b8a4a1f2b5 refactor(IRSACryptographer): Issuer und Audience Identifier String-Eigenschaften hinzugefügt 2024-12-05 14:50:05 +01:00
Developer 02
a69f610ef4 feat(CryptographerExtensions): Abfrage in SingleOrDefault verschieben 2024-12-05 14:38:32 +01:00
Developer 02
016d8bdcf2 feat(RSACryptographerList): Hinzufügen der Methode try get mit dem Wort out-key 2024-12-05 14:36:28 +01:00
Developer 02
738005f5dc feat(RSACryptographerList): Die Ausgabe der Indexer-Methode ist nicht null und wirft eine Ausnahme, wenn sie nicht gefunden wird. 2024-12-05 14:33:24 +01:00
Developer 02
c96af25e23 feat(CryptographerExtensions): Erstellt Erweiterungen zum Suchen und Erstellen von RSACryptographerList. 2024-12-05 14:26:20 +01:00
Developer 02
35e2fef046 feat(RSACryptographerList): Erstellt, um die Cryptographer-Liste sowohl als Wörterbuch als auch als IEnumerable zu verwenden 2024-12-05 13:37:34 +01:00
Developer 02
b8fb45d4a3 feat(AsymCryptService): Decryptors und Encryptors Getter hinzugefügt. 2024-12-05 13:17:23 +01:00
Developer 02
fa60147507 refactor(RSAFactoryParams): Implementierung von IJsonOnDeserialized anstelle von Lazy Initialization. 2024-12-05 12:12:56 +01:00
Developer 02
e9d408a717 feat(AsymCryptParams): EncryptedPrivateKeyFileTag, PrivateKeyFileTag, PublicKeyFileTag und RSAKeyNameSeparator aus RSAFactoryParams verschoben. 2024-12-05 11:34:35 +01:00
Developer 02
5fd3fa2fc6 feat(AsymCryptParams): IRSADecryptor-Liste und IRSAEncryptor-Liste hinzugefügt. 2024-12-05 11:31:00 +01:00
Developer 02
0d5bcedc01 refactor(DIExtensions): Umbenennung von TryAddCryptographerConverter in AddCryptographerConverter 2024-12-05 11:21:34 +01:00
Developer 02
2e68a37944 feat(HashAlgorithmNameConverter): Erstellt für benutzerfreundlichere json de/serilization.
- DI-Erweiterungsmethoden hinzugefügt
2024-12-05 11:06:11 +01:00
Developer 02
8076efb934 refactor(ReadOrCreateDirectory): Entfernt 2024-12-05 10:28:15 +01:00
Developer 02
c38f7dcf72 rektor(RSA): Umbenennung von dir in cryptographer und Verschiebung der zugehörigen Klassen 2024-12-05 10:03:39 +01:00
Developer 02
6e4942c885 feat(Config): Verzeichnis erstellt 2024-12-05 09:58:42 +01:00
Developer 02
d0dfd834b0 feat(Config): Verzeichnis erstellt und Params verschoben 2024-12-05 09:57:12 +01:00
Developer 02
aa9951f242 refactor: KeyType entfernt 2024-12-05 09:30:19 +01:00
Developer 02
506685a0b5 refactor(RSACryptographer): Verfallsdatum und Version entfernt 2024-12-05 09:17:44 +01:00
Developer 02
c9548238bb Revert "feat: CryptographerType-Enum hinzugefügt, um Schlüsseltypen darzustellen"
This reverts commit 3ffdd49a47.
2024-12-05 09:13:54 +01:00
Developer 02
3ffdd49a47 feat: CryptographerType-Enum hinzugefügt, um Schlüsseltypen darzustellen
Schlüssel zu kategorisieren.
- Werte hinzugefügt:
  - `Private` für private Schlüssel.
  - `EncPrivate` für verschlüsselte private Schlüssel.
  - `Public` für öffentliche Schlüssel.
2024-12-05 01:28:22 +01:00
Developer 02
609cd29dc5 feat(RSACryptographer): Issuer und Audience hinzugefügt 2024-12-05 01:24:03 +01:00
Developer 02
cc3d1f58d3 feat(RSACryptographer): Version hinzugefügt 2024-12-05 01:21:49 +01:00
Developer 02
c03f39c1a9 feat(RSACryptographer): Verfall hinzugefügt 2024-12-05 01:15:59 +01:00
Developer 02
750f7bc20c refactor(AsymCryptService): Entschlüsselungsinjektion entfernt 2024-12-05 00:53:27 +01:00
Developer 02
65989b23b3 refactor(RSAFactoryParams): Eigenschaft PbeParameters hinzugefügt 2024-12-05 00:43:42 +01:00
Developer 02
c895d2df0e feat(RSAFactory): Formatierer für Schlüsselnamen entfernen 2024-12-05 00:23:28 +01:00
Developer 02
0c451cb834 feat(Core.Security.DIExtensions): Injektion von Parametern hinzugefügt 2024-12-05 00:19:02 +01:00
Developer 02
9396f48f46 feat(Core.Security.DIExtensions): Arrangierte DI-Erweiterung 2024-12-05 00:02:03 +01:00
Developer 02
1a941b4728 feat(ReadOrCreateDirectory): Erstellt, um alle pem-Dateien aus dem Ordner zu lesen und neu zu erstellen, wenn die angegebenen Dateien nicht vorhanden sind. 2024-12-03 10:45:04 +01:00
Developer 02
c6942164e2 refactor(RSAFactory): _params wurde geschützt und generisch für die Verwendung in geerbten Klassen. 2024-12-03 10:29:40 +01:00
Developer 02
343560ed62 feat(AsymCryptParams): ReadOrCreateDirs-Eigenschaft zu params hinzugefügt, um die Aktualisierung von Entschlüsselungsprogrammen zu automatisieren 2024-12-03 10:24:49 +01:00
Developer 02
6873bac8a1 feat(AsymCryptParams): Erstellt als spezifizierte Optionen für AsymCryptService 2024-12-03 10:12:51 +01:00
Developer 02
09406ca505 feat(IAsymCryptService): Generischer Typ TParams hinzugefügt. 2024-12-03 10:07:58 +01:00
Developer 02
3aa5ad782f refactor: Aktualisierung der DefaultRSAKeyNameFormatter Signatur und Logik in RSAFactory
- Die Methode `DefaultRSAKeyNameFormatter` wurde geändert, um einen `visibilityTag`- und `expiration`-Parameter aufzunehmen.
- Redundante bedingte Logik für das Anhängen von Tags wurde entfernt und der Formatter für bessere Lesbarkeit und Skalierbarkeit umstrukturiert.
- Gewährleistung der Abwärtskompatibilität mit der Versionierung durch bedingte Behandlung von `passwordVersion`.
2024-12-03 09:54:42 +01:00
Developer 02
5991444efd feat(RSAFactoryParams): Erstellt, um die Konfigurationen der RSA-Fabrik zu trennen 2024-12-02 18:08:13 +01:00
Developer 02
f720ea9cd6 refactor(IRSAFactory): Erstellt, um die Funktionalität von RSAFactory zu trennen 2024-12-02 15:10:51 +01:00
Developer 02
a4b96c2f3e feat(Sicherheit): Umbenennung von CryptFactory und seiner Schnittstelle in (I)AsymCryptService 2024-12-02 13:46:15 +01:00
Developer 02
65c64a3f9a chore(API): Aktualisiert auf 2.0.1 2024-12-02 11:35:33 +01:00
Developer 02
1d600aa453 refactor: Nullbarkeitsannotation zu ControllerExtensions-Methoden hinzugefügt 2024-12-02 11:33:52 +01:00
Developer 02
816d5835f1 fix(BaseHttpClientService): Die Kodierung der Abfrageparameter wurde entfernt, da UriBuilder dies bereits tut.
- Hochgestuft auf 2.0.3
2024-11-26 23:45:06 +01:00
Developer 02
4a64a31d47 refactor(Abstraction): Hochgestuft auf 2.2.1. 2024-11-25 14:30:20 +01:00
Developer 02
e9b2ba788f refactor(IHttpClientOptions): Konvertiert Typ der Header von Key Value Pair Liste zu Dictionary. 2024-11-25 14:29:21 +01:00
Developer 02
e53813500a chore(Core.Client): aufgerüstet auf 2.0.1 2024-11-25 14:05:17 +01:00
Developer 02
25e3855de2 refactor(DIExtensions): BaseHttpClientService-Injektion entfernen 2024-11-25 14:02:54 +01:00
Developer 02
dd3d6e70cc chore(Client): hochgestuft auf 2.2.0 2024-11-25 11:49:41 +01:00
Developer 02
02a87309df chore(Abstraktionen): hochgestuft auf 2.2.0 2024-11-25 11:47:45 +01:00
Developer 02
0f7bdc9d0e refactor: Vereinfachung der Logik zur Zusammenführung von Headern und Abfrageparametern in BaseHttpClientService
- Verbesserung der Zusammenführung von Standard-Headern und Abfrageparametern durch Null-Prüfung und übersichtlichere Handhabung.
- Sicherstellung, dass die Logik einfacher zu verstehen und zu warten ist.
2024-11-25 11:46:08 +01:00
Developer 02
f9df2fb29e feat: DI-Erweiterung für HttpClient-Services verbessert
- `AddHttpClientService` refaktoriert, um `AddHttpClientServiceDefaults` für gemeinsame Setup-Logik einzuführen.
- Überladungen für `AddHttpClientService` hinzugefügt, um sowohl `IConfigurationSection` als auch direkte Options-Instanz zu unterstützen.
- Bessere Erweiterbarkeit und sauberere Service-Konfiguration sichergestellt.
2024-11-25 11:35:46 +01:00
Developer 02
ef7da0e52c refactor(HttpClientOptions): entfernt und durch IHttpClientOptions mit Klasseneinschränkung ersetzt 2024-11-25 11:19:41 +01:00
Developer 02
f602a842be revert: IHttpClientOptions entfernen 2024-11-25 11:03:15 +01:00
Developer 02
52a7664e57 fix(Client.DIExtensions): Generischer Typ zur Injektion mehrerer Client-Dienste hinzugefügt 2024-11-25 10:58:45 +01:00
Developer 02
ea3d1312b8 refactor(BaseHttpClientService): aktualisiert, um den Pfad zu initialisieren emty string, wenn es null ist und HttpClientOptions ohne IOptions hinzugefügt 2024-11-25 10:54:34 +01:00
Developer 02
3b8b315fea refactor(IHttpClientOptions): removed 2024-11-25 10:42:22 +01:00
Developer 02
c65eefb954 feat(IHttpClientOptions): Abfrage-Parameter und Header hinzugefügt.
- Geordnete DI-Erweiterungen.
2024-11-25 10:30:33 +01:00
Developer 02
997fd533ac feat(BaseHttpClientService): Path getter und intter entfernt und geschützte readonly _path Variable hinzugefügt. 2024-11-25 10:11:13 +01:00
Developer 02
bcfb5a8a70 feat(BaseHttpClientService): Uri Getter und Setter entfernt und geschützte readonly _uri Variable hinzugefügt. 2024-11-25 10:09:05 +01:00
Developer 02
049e9977f4 feat(BaseHttpClientService): Optionale Standard-Header und QueryParams hinzugefügt 2024-11-25 10:05:42 +01:00
Developer 02
0334fc4cdf refactor(BaseHttpClientService): Verwendung von IEnumerable<KeyValuePair<string, object>> anstelle von Dictionary<string, string> in queryParams, form und headers inputs der FetchAsync Methode 2024-11-25 09:28:47 +01:00
Developer 02
0c2334cefb refactor(BaseHttpClientService): Der Wert von query params wurde zum nullbaren Objekt, um Flag-Parameter hinzuzufügen.
- Aktualisierte Schnittstelle und Logik unter Berücksichtigung dieser Situation
2024-11-22 14:35:22 +01:00
Developer 02
dd7f1c1ea0 fix(BaseHttpClientService): Null-Kontrolle zum Pfad hinzugefügt 2024-11-22 13:19:42 +01:00
Developer 02
4bb242a4cc feat(Tests.Client.BaseHttpClientServiceTests): Test für Abfrageparameter hinzugefügt 2024-11-22 12:48:36 +01:00
Developer 02
b577067379 chore: gitignore aktualisieren 2024-11-22 12:47:24 +01:00
Developer 02
bd4d4856ea feat(IHttpClientOptions):
Basispfad zu http-Client-Optionen hinzugefügt
2024-11-22 12:05:13 +01:00
Developer 02
c3a12ba5b7 chore: hochgestuft auf 1.1.0 2024-11-22 10:30:26 +01:00
Developer 02
478bf13a4a Revert "chore(Client): hochgestuft auf 2,1"
This reverts commit d8849f48da.
2024-11-22 10:29:03 +01:00
Developer 02
d8849f48da chore(Client): hochgestuft auf 2,1 2024-11-22 10:26:49 +01:00
Developer 02
c466c553dc chore: hochgestuft auf 2.1 2024-11-22 10:25:32 +01:00
Developer 02
48afa6b433 feat(BaseHttpClientService.FetchAsync): Schema-, Port-, Pfad- und Query-Parameter-Optionen hinzugefügt 2024-11-22 10:12:40 +01:00
Developer 02
e44b2895c9 feat(IHttpClientOptions): erstellt zur Abstraktion 2024-11-22 09:18:19 +01:00
Developer 02
85e5fc4018 feat(BaseHttpClientService): Header hinzugefügt 2024-11-22 09:15:04 +01:00
Developer 02
70ccec9fef feat(RSAFactory.ReadRSADecryptorAsync): ReadRSADecryptorAsync-Methode hinzugefügt, um die pem-Datei zu lesen und den Decryptor asynchron zu erstellen 2024-11-22 09:06:58 +01:00
Developer 02
f7193594b1 fix(RSAFactory): Dateiname und seine Erweiterung aus der Methode DefaultRSAKeyNameFormatter entfernt 2024-11-20 17:14:12 +01:00
Developer 02
9c7319634a fix(RSAExtensions): Schlüssel in Dateinamen umbenennen 2024-11-20 17:11:44 +01:00
Developer 02
3becb208ec fix(RSAExtensions): Falsche Methoden zur Schlüsselbenennung entfernt 2024-11-20 17:10:57 +01:00
Developer 02
1b00f9afa2 feat(CryptFactory): Der Parameter seperator der Funktionseigenschaft CryptFactory.RSAKeyNameFormatter ist jetzt nullbar. 2024-11-20 16:47:26 +01:00
Developer 02
b58d4aed2f feat(RSAFactory): Statische Readonly-Eigenschaft hinzugefügt, um den Standard-RSA-Schlüsselnamen-Separator zu speichern 2024-11-20 16:43:27 +01:00
Developer 02
5adc67edf2 feat (CryptFactory): Verschieben der Standardparameter des RSA-Namensformatierers in die RSAFactory 2024-11-20 16:40:24 +01:00
Developer 02
0ff0de8159 feat (CryptFactory.RSADecryptorKeyFormatter): aktualisiert, um die erforderlichen Parameter als Eingabe zu nehmen, anstatt IRSADecryptor direkt als Eingabe zu nehmen 2024-11-20 16:37:09 +01:00
Developer 02
49b49271f3 feat(CryptFactory): ValidateForbidden ve ValidateSeparator Methoden in DefaultRSADecryptorKeyFormatter hinzugefügt 2024-11-20 15:13:05 +01:00
Developer 02
5c5a6bd181 feat(CryptFactory): RSADecryptorKeyFormatter Funktionseigenschaft hinzugefügt, um standardisierte Schlüsselnamen zu erstellen 2024-11-20 14:18:55 +01:00
Developer 02
6ab1777f7c refactor(RSADecryptor): aktualisiert, um im Passwort- und Versions-Tupel-Format zu initieren, um Datenintegrität zu gewährleisten.
- password und PasswordVersion initter entfernt.
2024-11-20 12:49:36 +01:00
Developer 02
103ddf5c2e feat(RSADecryptor): PasswordVersion-Eigenschaft hinzugefügt. Password.get intern gemacht.
- Password.get entfernt und PasswordVersion-Eigenschaft in IRSADecryptor hinzugefügt
2024-11-20 11:17:38 +01:00
Developer 02
f9c94e8464 refactor(IRSADecryptor): HasEncryptedPem getter-Methode hinzugefügt 2024-11-20 10:52:39 +01:00
Developer 02
cdb0009e7c refactor(RSADecryptor): statt der Verwendung einer separaten init-Methode zur Initialisierung von RSA, wurde Lazy Loading verwendet. 2024-11-20 10:51:18 +01:00
Developer 02
5010224500 feat(RSADecryptor): Eigenschaft hinzugefügt, um zu prüfen, ob der RSADecryptor pem verschlüsselt hat. 2024-11-20 10:38:34 +01:00
Developer 02
1ebdd7e5bb feat(RSADecryptor): Öffentliche Constructure-Methode gemacht. 2024-11-20 10:33:11 +01:00
Developer 02
0e0513e640 feat(RSAExtensions): Methoden zum Speichern von IRSACryptographer.Pem erstellt. 2024-11-20 10:32:25 +01:00
Developer 02
683b95c205 refactor(RSAExtensions): GetRSADecryptor, TryGetRSADecryptor, GetRSAEncryptor und TryGetRSADecryptor Methoden hinzugefügt. 2024-11-20 00:15:27 +01:00
Developer 02
f28b43cc06 refactor(RSADecryptor): Lazy Loading in Encryptor Getter integriert, um die Leistung zu verbessern. 2024-11-19 23:58:04 +01:00
Developer 02
777a8a73ac refactor: AddSecurity-Methode aktualisiert, um ICryptFactory direkt mit der CryptFactory-Instanz zu registrieren 2024-11-19 23:51:49 +01:00
Developer 02
77fc06991b feat(CryptFactory): Erstellung einer separaten RSAFactory zur Erzeugung einer statischen Instanz 2024-11-19 23:49:34 +01:00
Developer 02
eeb50e837d feat: Unterstützung für IRSADecryptor und Verwaltung der RSA-Entschlüsselung in den Klassen ICryptFactory und CryptFactory hinzugefügt
ICryptFactory:
- `IRSADecryptor this[string key]`-Indexer für den Zugriff auf Entschlüssler per Schlüssel hinzugefügt.
- Methode `TryGetRSADecryptor` für das sichere Abrufen von Entschlüsslern eingeführt.

CryptFactory:
- `IRSADecryptor`-Indexer für die Verwaltung von Entschlüsslern implementiert.
- Ein `Decryptors`-Dictionary hinzugefügt, um RSA-Entschlüssler nach Schlüssel zu speichern.
- Konstruktor aktualisiert, um `Decryptors` mit einem bereitgestellten oder leeren Dictionary zu initialisieren.
- `TryGetRSADecryptor` zur Entschlüssler-Abfrage implementiert.
2024-11-19 23:14:44 +01:00
Developer 02
1b210714fd feat(CryptFactory): Startprotokoll hinzugefügt, um Informationen über Core.Secrets bereitzustellen 2024-11-19 20:01:54 +01:00
Developer 02
806bc01c17 refactor(PbePassword): CryptFactory.PbePassword.get privat und Secrets.PBE_PASSWORD intern gemacht.
- JsonIgnore-Attribut zu Secrets.PBE_PASSWORD hinzugefügt
 - ICryptFactory.PbePassword.get wurde entfernt.
2024-11-19 19:44:52 +01:00
Developer 02
0169097671 Chore: Hinzufügen des .net 8-Frameworks zu allen .net-Projekten.
- Zentralisierte Nuget-Symbole.
 - Entfernte Projekte gelöscht.
2024-11-19 19:21:40 +01:00
Developer 02
90c73237eb feat(Secrets): Statische Klasse Secrets erstellt, um feste Werte wie pbe password zu speichern.
- Statische Eigenschaften wie Version und Erstellungsdatum hinzugefügt, um versteckte Konstanten in der Produktion nach einem Produktionsupdate zu verfolgen.
2024-11-19 18:08:11 +01:00
Developer 02
2a9c9551b8 refactor(ICryptFactory.Password): umbenennen in PbePassword 2024-11-19 17:16:41 +01:00
Developer 02
a39728dff5 refactor(CryptFactory.Password): umbenennen in PbePassword 2024-11-19 17:14:54 +01:00
Developer 02
7048f385ef feat: Erweiterung der CryptFactory um RSA-Schlüsselerzeugung und Verschlüsselungsunterstützung
- Hinzugefügt: Eigenschaften KeySizeInBits, Password, PbeEncryptionAlgorithm, PbeHashAlgorithmName, PbeIterationCount und EncryptedPrivateKeyPemLabel zur Unterstützung der Konfiguration von RSA-Schlüsselerzeugung und Verschlüsselung in der CryptFactory.

 - Hinzugefügt: Methoden CreateRSAPrivateKeyPem und CreateEncryptedPrivateKeyPem zur Erstellung von RSA-Privatschlüsseln und verschlüsselten Private-Key-PEMs.

 - Geändert: ICryptFactory-Schnittstelle um neue Eigenschaften und Methoden erweitert.
2024-11-19 17:11:52 +01:00
Developer 02
cb9c5746b0 feat(CryptFactory.LazyStaticCryptFactory): umbenennen in LazyInstance 2024-11-19 13:47:31 +01:00
Developer 02
ed36015d1e fix: CryptFactory.Instance in Getter-Methode für träges Laden umwandeln 2024-11-19 13:32:38 +01:00
Developer 02
6ce4a08c53 feat: DI-Erweiterung zur Registrierung von CryptFactory hinzugefügt 2024-11-19 13:19:14 +01:00
Developer 02
4c379c2d4d feat(RSAExtensions) : Methoden hinzugefügt, um einen Verschlüsseler anhand seines Ausstellers und seiner Zielgruppe aus einem Wörterbuch zu erhalten 2024-11-18 17:56:21 +01:00
Developer 02
fee43c00ca feat(CryptFactory) : initiliazierte Schnittstellen.
- Lazy-Methode hinzugefügt, um statische CryptFactory zu beweisen
2024-11-18 17:44:55 +01:00
Developer 02
ee3060158e refactor(RSADecryptor): Konstruktionsmethode intern gemacht 2024-11-18 17:35:01 +01:00
Developer 02
4e615d7e39 feat(RSACryptographer): RSAEncryptionPadding nicht erforderlich gemacht und OaepSHA256 als Standard zugewiesen 2024-11-18 17:32:14 +01:00
Developer 02
d1fea581d7 feat(Tests.Security): initialisiert RSADecryptorTests. 2024-11-18 17:22:38 +01:00
Developer 02
26a68cd477 fix(Core.Security): pem-Importprozess in den Initilizer mehetods verschoben 2024-11-18 17:14:42 +01:00
Developer 02
eccf2b32ce Refactor(Core.Security): Getrennte Pem-Eigenschaften für öffentliche und private Schlüssel wurden entfernt.
- Pem-Eigenschaft in der Hauptklasse RSACryptographer erstellt
2024-11-18 14:39:18 +01:00
Developer 02
6ff0d0a876 feat(RSADecryptor): Aktualisiert für den Import von verschlüsseltem pem 2024-11-18 14:27:53 +01:00
Developer 02
0bb779b7b6 refactor(Core.Security): Implementierung der entsprechenden Schnittstellen zu RSACryptographer, RSADecryptor und RSAEncryptor. 2024-11-18 11:04:24 +01:00
Developer 02
51ebf3fa67 refactor(Core.Security): Entfernt die Erweiterungsmethoden im aktuellen Projekt.
- Projekt Security.Extensions hinzugefügt.
2024-11-18 10:58:34 +01:00
Developer 02
8cc6fd95f7 feat(Abstraktionen.Sicherheit): Schnittstellen für IRSACryptographer, IRSADecryptor und IRSAEncryptor erstellt. 2024-11-18 10:54:57 +01:00
Developer 02
c5b422921b feat(DigitalData.Core.Security.Extensions): Verschiebung der Methoden RSAExtensions und Extensions. 2024-11-18 10:42:48 +01:00
Developer 02
7b571e4d86 feat(DigitalData.Core.Security.Extensions): Initialisiert. 2024-11-18 10:41:16 +01:00
Developer 02
c39b554165 refactor(RSADecryptor): PublicKeyPem entfernt. 2024-11-18 10:36:15 +01:00
Developer 02
489ca67203 Refactor(RSACryptographer): Entfernte Pem initter Methode.
- PrivateKeyPem initter Methode zu RSADecryptor hinzugefügt.
 - PublicKeyPem getter und initter Methoden zu RSAEncryptor hinzugefügt.
2024-11-18 10:33:38 +01:00
Developer 02
0804ea1418 refactor: RSA-Kryptografie-Klassen für bessere Flexibilität und Effizienz überarbeitet
- Konstruktoren zu `RSACryptographer`, `RSADecryptor` und `RSAEncryptor` hinzugefügt, um die Initialisierung zu verbessern.
- `PublicKeyPem` in `RSADecryptor` optimiert, um unnötige Objekterstellungen zu vermeiden.
- `Verify`-Methode in `RSAEncryptor` korrigiert, um eine korrekte Signaturprüfung zu gewährleisten.
- Code-Wiederverwendbarkeit verbessert, indem Base64-Konvertierungslogik zentralisiert wurde.
2024-11-16 03:24:19 +01:00
Developer 02
84dbca97d5 feat(Core.Security): Erstellte Erweiterungsmethoden 2024-11-16 02:14:28 +01:00
Developer 02
8c350db146 chore: update gitignroe 2024-11-14 10:26:07 +01:00
Developer 02
471dace359 feat: Projekt initialisieren 2024-11-14 09:59:14 +01:00
103 changed files with 1374 additions and 2413 deletions

3
.gitignore vendored
View File

@@ -408,3 +408,6 @@ FodyWeavers.xsd
/DigitalData.Core.ConsoleApp/DigitalData.Core.ConsoleApp.csproj
/DigitalData.Core.ConsoleApp/Program.cs
/DigitalData.Core.ConsoleApp/FooHttpOptions.cs
/DigitalData.Core.Tests/obj/
/DigitalData.Core.Terminal
/DigitalData.Core.Tests.API

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1020 KiB

View File

@@ -7,7 +7,7 @@ namespace DigitalData.Core.API
[ApiController]
[Route("api/[controller]")]
public class BasicCRUDControllerBase<TCRUDService, TDto, TEntity, TId> : CRUDControllerBase<TCRUDService, TDto, TDto, TDto, TEntity, TId>
where TCRUDService : ICRUDService<TDto, TDto, TDto, TEntity, TId>
where TCRUDService : ICRUDService<TDto, TDto, TEntity, TId>
where TDto : class, IUnique<TId>
where TEntity : class, IUnique<TId>
{

View File

@@ -11,13 +11,12 @@ namespace DigitalData.Core.API
/// <typeparam name="TCRUDService">The derived CRUD service type implementing ICRUDService<TCreateDto, TReadDto, TUpdateDto, TEntity, TId>.</typeparam>
/// <typeparam name="TCreateDto">The Data Transfer Object type for create operations.</typeparam>
/// <typeparam name="TReadDto">The Data Transfer Object type for read operations.</typeparam>
/// <typeparam name="TUpdateDto">The Data Transfer Object type for update operations.</typeparam>
/// <typeparam name="TEntity">The entity type CRUD operations will be performed on.</typeparam>
/// <typeparam name="TId">The type of the entity's identifier.</typeparam>
[ApiController]
[Route("api/[controller]")]
public class CRUDControllerBase<TCRUDService, TCreateDto, TReadDto, TUpdateDto, TEntity, TId> : ControllerBase
where TCRUDService : ICRUDService<TCreateDto, TReadDto, TUpdateDto, TEntity, TId>
where TCRUDService : ICRUDService<TCreateDto, TReadDto, TEntity, TId>
where TCreateDto : class
where TReadDto : class
where TUpdateDto : class, IUnique<TId>

View File

@@ -12,13 +12,12 @@ namespace DigitalData.Core.API
/// <typeparam name="TCRUDService">The derived CRUD service type implementing ICRUDService<TCreateDto, TReadDto, TUpdateDto, TEntity, TId>.</typeparam>
/// <typeparam name="TCreateDto">The Data Transfer Object type for create operations.</typeparam>
/// <typeparam name="TReadDto">The Data Transfer Object type for read operations.</typeparam>
/// <typeparam name="TUpdateDto">The Data Transfer Object type for update operations.</typeparam>
/// <typeparam name="TEntity">The entity type CRUD operations will be performed on.</typeparam>
/// <typeparam name="TId">The type of the entity's identifier.</typeparam>
[ApiController]
[Route("api/[controller]")]
public class CRUDControllerBaseWithErrorHandling<TCRUDService, TCreateDto, TReadDto, TUpdateDto, TEntity, TId> : ControllerBase
where TCRUDService : ICRUDService<TCreateDto, TReadDto, TUpdateDto, TEntity, TId>
where TCRUDService : ICRUDService<TCreateDto, TReadDto, TEntity, TId>
where TCreateDto : class
where TReadDto : class
where TUpdateDto : class, IUnique<TId>

View File

@@ -19,7 +19,7 @@ namespace DigitalData.Core.API
/// <param name="index">The key in the ViewData dictionary where the value will be stored.</param>
/// <param name="value">The value to be stored in the ViewData dictionary.</param>
/// <returns>The same ViewResult object with updated ViewData, allowing for additional chained operations.</returns>
public static ViewResult WithData(this ViewResult viewResult, string index, object value)
public static ViewResult WithData(this ViewResult viewResult, string index, object? value)
{
viewResult.ViewData[index] = value;
return viewResult;

View File

@@ -1,23 +1,32 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net7.0</TargetFramework>
<TargetFrameworks>net7.0;net8.0</TargetFrameworks>
<IsPackable>true</IsPackable>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<OutputType>Library</OutputType>
<Description>This package provides a comprehensive set of API controllers and related utilities for the DigitalData.Core library. It includes generic CRUD controllers, localization extensions, middleware for security policies, and application model conventions.</Description>
<PackageId>DigitalData.Core.API</PackageId>
<Version>2.0.0.0</Version>
<Version>2.1.1</Version>
<Authors>Digital Data GmbH</Authors>
<Company>Digital Data GmbH</Company>
<Product>DigitalData.Core.API</Product>
<Copyright>Copyright 2024</Copyright>
<RepositoryUrl>http://git.dd:3000/AppStd/WebCoreModules.git</RepositoryUrl>
<PackageTags>digital data core api</PackageTags>
<PackageIcon>Assets\icon.png</PackageIcon>
<PackageIcon>core_icon.png</PackageIcon>
<AssemblyVersion>2.1.1</AssemblyVersion>
<FileVersion>2.1.1</FileVersion>
</PropertyGroup>
<ItemGroup>
<None Include="..\..\nuget-package-icons\core_icon.png">
<Pack>True</Pack>
<PackagePath>\</PackagePath>
</None>
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Logging" Version="7.0.0" />
</ItemGroup>

View File

@@ -15,7 +15,7 @@ namespace DigitalData.Core.Abstractions.Application
/// This interface is useful for entities that do not require different DTOs for different operations,
/// allowing for a more concise and maintainable codebase when implementing services for such entities.
/// </remarks>
public interface IBasicCRUDService<TDto, TEntity, TId> : ICRUDService<TDto, TDto, TDto, TEntity, TId>
public interface IBasicCRUDService<TDto, TEntity, TId> : ICRUDService<TDto, TDto, TEntity, TId>
where TDto : class, IUnique<TId> where TEntity : class, IUnique<TId>
{
}

View File

@@ -2,8 +2,8 @@
namespace DigitalData.Core.Abstractions.Application
{
public interface ICRUDService<TCreateDto, TReadDto, TUpdateDto, TEntity, TId> : IReadService<TReadDto, TEntity, TId>
where TCreateDto : class where TReadDto : class where TUpdateDto : IUnique<TId> where TEntity : class, IUnique<TId>
public interface ICRUDService<TCreateDto, TReadDto, TEntity, TId> : IReadService<TReadDto, TEntity, TId>
where TCreateDto : class where TReadDto : class where TEntity : class, IUnique<TId>
{
/// <summary>
/// Asynchronously creates a new entity based on the provided <paramref name="createDto"/> and returns the identifier of the created entity wrapped in a <see cref="DataResult{TId}"/>.
@@ -20,6 +20,6 @@ namespace DigitalData.Core.Abstractions.Application
/// </summary>
/// <param name="updateDto">The updateDTO with updated values for the entity.</param>
/// <returns>An Result indicating the outcome of the update operation, with an appropriate message.</returns>
Task<Result> UpdateAsync(TUpdateDto updateDto);
Task<Result> UpdateAsync<TUpdateDto>(TUpdateDto updateDto) where TUpdateDto : IUnique<TId>;
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1020 KiB

View File

@@ -4,15 +4,17 @@ namespace DigitalData.Core.Abstractions.Client
{
public interface IBaseHttpClientService
{
public string Uri { get; init; }
public CookieCollection GetCookies(string route = "");
CookieCollection GetCookies(string path = "");
Task<HttpResponseMessage> FetchAsync(
string route = "",
string? scheme = null,
int? port = null,
string path = "",
IEnumerable<KeyValuePair<string, object?>>? queryParams = null,
HttpMethod? method = null,
HttpContent? body = null,
Dictionary<string, string>? form = null,
IEnumerable<KeyValuePair<string, object>>? form = null,
IEnumerable<KeyValuePair<string, object>>? headers = null,
bool sendWithCookie = true,
bool saveCookie = true
);

View File

@@ -0,0 +1,13 @@
namespace DigitalData.Core.Abstractions.Client
{
public interface IHttpClientOptions
{
string Uri { get; init; }
string? Path { get; init; }
Dictionary<string, object>? Headers { get; init; }
Dictionary<string, object?>? QueryParams { get; init; }
}
}

View File

@@ -1,6 +1,6 @@
namespace DigitalData.Core.Abstractions.Client
{
public interface IHttpClientService<TClientOptions> : IBaseHttpClientService
public interface IHttpClientService<TClientOptions> : IBaseHttpClientService where TClientOptions : IHttpClientOptions
{
}
}

View File

@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net7.0</TargetFramework>
<TargetFrameworks>net7.0;net8.0</TargetFrameworks>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<!-- NuGet Package Metadata -->
@@ -9,18 +9,26 @@
<Authors>Digital Data GmbH</Authors>
<Company>Digital Data GmbH</Company>
<Product>DigitalData.Core.Abstractions</Product>
<Description>This package contains abstractions for the DigitalData.Core.Abstractions library, developed according to the principles of Clean Architecture. It promotes separation of concerns and enables independent core logic.</Description>
<Description>This package contains abstractions for the DigitalData.Core library, developed according to the principles of Clean Architecture. It promotes separation of concerns and enables independent core logic.</Description>
<PackageTags>digital data core abstractions clean architecture</PackageTags>
<GeneratePackageOnBuild>True</GeneratePackageOnBuild>
<Copyright>Copyright 2024</Copyright>
<PackageProjectUrl></PackageProjectUrl>
<RepositoryUrl>http://git.dd:3000/AppStd/WebCoreModules.git</RepositoryUrl>
<PackAsTool>False</PackAsTool>
<NeutralLanguage>aa-DJ</NeutralLanguage>
<PackageIcon>Assets\icon.png</PackageIcon>
<Version>2.0.0.0</Version>
<PackageIcon>core_icon.png</PackageIcon>
<Version>3.1.0</Version>
<AssemblyVersion>3.1.0</AssemblyVersion>
<FileVersion>3.1.0</FileVersion>
</PropertyGroup>
<ItemGroup>
<None Include="..\..\nuget-package-icons\core_icon.png">
<Pack>True</Pack>
<PackagePath>\</PackagePath>
</None>
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="7.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="7.0.4" />
@@ -33,12 +41,4 @@
<ProjectReference Include="..\DigitalData.Core.DTO\DigitalData.Core.DTO.csproj" />
</ItemGroup>
<ItemGroup>
<None Update="Assets\icon.png">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
<Pack>True</Pack>
<PackagePath>\</PackagePath>
</None>
</ItemGroup>
</Project>

View File

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

View File

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

View File

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

View File

@@ -0,0 +1,23 @@
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

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

View File

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

View File

@@ -0,0 +1,74 @@
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

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

View File

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

View File

@@ -0,0 +1,15 @@
using Microsoft.IdentityModel.Tokens;
namespace DigitalData.Core.Abstractions.Security
{
public interface IJwtSignatureHandler<TPrincipal>
{
SecurityToken CreateToken(SecurityTokenDescriptor tokenDescriptor);
SecurityToken CreateToken(TPrincipal subject, IAsymmetricTokenDescriptor descriptor);
SecurityToken CreateToken(TPrincipal subject, string issuer, string audience);
string WriteToken(SecurityToken token);
}
}

View File

@@ -0,0 +1,24 @@
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

@@ -0,0 +1,62 @@
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
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1020 KiB

View File

@@ -19,7 +19,7 @@ namespace DigitalData.Core.Application
/// and a culture-specific translation service for any necessary text translations, ensuring a versatile and internationalized approach to CRUD operations.
/// </remarks>
public class BasicCRUDService<TCRUDRepository, TDto, TEntity, TId> :
CRUDService<TCRUDRepository, TDto, TDto, TDto, TEntity, TId>, IBasicCRUDService<TDto, TEntity, TId>
CRUDService<TCRUDRepository, TDto, TDto, TEntity, TId>, IBasicCRUDService<TDto, TEntity, TId>
where TCRUDRepository : ICRUDRepository<TEntity, TId> where TDto : class, IUnique<TId> where TEntity : class, IUnique<TId>
{
/// <summary>

View File

@@ -12,11 +12,10 @@ namespace DigitalData.Core.Application
/// </summary>
/// <typeparam name="TCreateDto">The DTO type for create operations.</typeparam>
/// <typeparam name="TReadDto">The DTO type for read operations.</typeparam>
/// <typeparam name="TUpdateDto">The DTO type for update operations.</typeparam>
/// <typeparam name="TEntity">The entity type.</typeparam>
/// <typeparam name="TId">The type of the identifier for the entity.</typeparam>
public class CRUDService<TCRUDRepository, TCreateDto, TReadDto, TUpdateDto, TEntity, TId> : ReadService<TCRUDRepository, TReadDto, TEntity, TId>, ICRUDService<TCreateDto, TReadDto, TUpdateDto, TEntity, TId>
where TCRUDRepository : ICRUDRepository<TEntity, TId> where TCreateDto : class where TReadDto : class where TUpdateDto : IUnique<TId> where TEntity : class, IUnique<TId>
public class CRUDService<TCRUDRepository, TCreateDto, TReadDto, TEntity, TId> : ReadService<TCRUDRepository, TReadDto, TEntity, TId>, ICRUDService<TCreateDto, TReadDto, TEntity, TId>
where TCRUDRepository : ICRUDRepository<TEntity, TId> where TCreateDto : class where TReadDto : class where TEntity : class, IUnique<TId>
{
/// <summary>
@@ -45,7 +44,7 @@ namespace DigitalData.Core.Application
/// </summary>
/// <param name="updateDto">The DTO to update an entity from.</param>
/// <returns>A service message indicating success or failure.</returns>
public virtual async Task<Result> UpdateAsync(TUpdateDto updateDto)
public virtual async Task<Result> UpdateAsync<TUpdateDto>(TUpdateDto updateDto) where TUpdateDto : IUnique<TId>
{
var currentEntitiy = await _repository.ReadByIdAsync(updateDto.Id);

View File

@@ -40,7 +40,6 @@ namespace DigitalData.Core.Application
/// <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="TUpdateDto">The DTO type used for update 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>
@@ -48,9 +47,9 @@ namespace DigitalData.Core.Application
/// <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 where TUpdateDto : class, IUnique<TId> where TEntity : class, IUnique<TId> where TProfile : Profile
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, TUpdateDto, TEntity, TId>, CRUDService<TCRUDRepository, TCreateDto, TReadDto, TUpdateDto, TEntity, TId>>();
services.AddScoped<ICRUDService<TCreateDto, TReadDto, TEntity, TId>, CRUDService<TCRUDRepository, TCreateDto, TReadDto, TEntity, TId>>();
configureService?.Invoke(services);
services.AddAutoMapper(typeof(TProfile).Assembly);

View File

@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net7.0</TargetFramework>
<TargetFrameworks>net7.0;net8.0</TargetFrameworks>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<GeneratePackageOnBuild>True</GeneratePackageOnBuild>
@@ -11,14 +11,16 @@
<Company>Digital Data GmbH</Company>
<Product>DigitalData.Core.Application</Product>
<Copyright>Copyright 2024</Copyright>
<PackageIcon>icon.png</PackageIcon>
<PackageIcon>core_icon.png</PackageIcon>
<RepositoryUrl>http://git.dd:3000/AppStd/WebCoreModules.git</RepositoryUrl>
<PackageTags>digital data core application clean architecture</PackageTags>
<Version>2.0.0.0</Version>
<Version>3.0.1</Version>
<AssemblyVersion>3.0.1</AssemblyVersion>
<FileVersion>3.0.1</FileVersion>
</PropertyGroup>
<ItemGroup>
<None Include="..\DigitalData.Core.Abstractions\Assets\icon.png">
<None Include="..\..\nuget-package-icons\core_icon.png">
<Pack>True</Pack>
<PackagePath>\</PackagePath>
</None>
@@ -39,11 +41,4 @@
<ProjectReference Include="..\DigitalData.Core.Abstractions\DigitalData.Core.Abstractions.csproj" />
</ItemGroup>
<ItemGroup>
<None Update="Assets\icon.png">
<PackagePath>\</PackagePath>
<Pack>True</Pack>
</None>
</ItemGroup>
</Project>

View File

@@ -1,6 +1,9 @@
<?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' ">
<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>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1020 KiB

View File

@@ -1,44 +1,113 @@
using DigitalData.Core.Abstractions.Client;
using Microsoft.Extensions.Options;
using System.Diagnostics.CodeAnalysis;
using System.Net;
using System.Web;
namespace DigitalData.Core.Client
{
public class BaseHttpClientService : IBaseHttpClientService
{
protected readonly HttpClient _client;
protected readonly CookieContainer _cookies;
protected readonly CookieContainer _cookies;
[StringSyntax("Uri")]
public string Uri { get; init; }
protected readonly string _uri;
public BaseHttpClientService(HttpClient client, CookieContainer cookieContainer, IOptions<HttpClientOptions> clientOptions)
protected readonly string _path;
protected IEnumerable<KeyValuePair<string, object>>? _headers;
protected IEnumerable<KeyValuePair<string, object?>>? _queryParams;
internal BaseHttpClientService(HttpClient client, CookieContainer cookieContainer, IHttpClientOptions clientOptions)
{
_client = client;
_cookies = cookieContainer;
Uri = clientOptions.Value.Uri;
_uri = clientOptions.Uri.Trim(URI_TRIM_CHARS);
_path = clientOptions.Path?.Trim(URI_TRIM_CHARS) ?? string.Empty;
_headers = clientOptions.Headers;
_queryParams = clientOptions.QueryParams;
}
public CookieCollection GetCookies(string route = "") => _cookies.GetCookies(uri: new Uri(Uri + route));
public CookieCollection GetCookies(string path = "") => _cookies.GetCookies(uri: new Uri(UriCombine(_uri, path, path.Trim(URI_TRIM_CHARS))));
public async Task<HttpResponseMessage> FetchAsync(
string route = "",
string? scheme = null,
int? port = null,
string path = "",
IEnumerable<KeyValuePair<string, object?>>? queryParams = null,
HttpMethod? method = null,
HttpContent? body = null,
Dictionary<string, string>? form = null,
IEnumerable<KeyValuePair<string, object>>? form = null,
IEnumerable<KeyValuePair<string, object>>? headers = null,
bool sendWithCookie = true,
bool saveCookie = true
)
{
// merge with default headers
if(_headers is not null)
{
if (headers is null)
headers = _headers;
else
{
var mergedHeaders = headers.ToList();
mergedHeaders.AddRange(_headers);
headers = mergedHeaders;
}
}
// Add default query parameters
if(_queryParams is not null)
{
if (queryParams is null)
queryParams = _queryParams;
else
{
var mergedQueryParams = queryParams.ToList();
mergedQueryParams.AddRange(_queryParams);
queryParams = mergedQueryParams;
}
}
// set default HTTP method as GET
method ??= HttpMethod.Get;
// create URL
var requestUriStr = Uri + route;
var requestUri = new Uri(requestUriStr);
var uriBuilder = new UriBuilder(_uri);
if (scheme is not null)
uriBuilder.Scheme = scheme;
if (port is int portInt)
uriBuilder.Port = portInt;
uriBuilder.Path = UriCombine(_path, path?.Trim(URI_TRIM_CHARS) ?? string.Empty);
var requestMessage = new HttpRequestMessage(method, requestUriStr);
// Add query parameters if provided
if (queryParams?.Any() ?? false)
{
var query = HttpUtility.ParseQueryString(uriBuilder.Query);
var flagParams = queryParams.Where(param => param.Value is null).Select(param => param.Key);
var valueParams = queryParams.Where(param => param.Value is not null);
foreach (var param in valueParams)
query[param.Key] = param.Value switch
{
bool b => b.ToString().ToLower(),
_ => param.Value.ToString()
};
if (flagParams.Any())
uriBuilder.Query = string.Join(QUERY_SEPARATOR, query.ToString(), string.Join(QUERY_SEPARATOR, flagParams));
else uriBuilder.Query = query.ToString();
}
var requestUri = uriBuilder.Uri;
var requestMessage = new HttpRequestMessage(method, requestUri);
// Add headers if provided
headers?.ForEach(header => requestMessage.Headers.Add(header.Key, header.Value.ToString()));
// Add cookie to request
if (sendWithCookie)
@@ -56,7 +125,7 @@ namespace DigitalData.Core.Client
else if (body != null)
requestMessage.Content = body;
else if (form != null)
requestMessage.Content = new FormUrlEncodedContent(form);
requestMessage.Content = new FormUrlEncodedContent(form.Select(e => KeyValuePair.Create(e.Key, e.Value.ToString())));
var response = await _client.SendAsync(requestMessage);
@@ -68,5 +137,11 @@ namespace DigitalData.Core.Client
return response;
}
internal static readonly char[] URI_TRIM_CHARS = { '\\', '/', ' ' };
internal static string UriCombine(params string[] paths) => System.IO.Path.Combine(paths).Replace("\\", "/");
internal static readonly char QUERY_SEPARATOR = '&';
}
}

View File

@@ -1,33 +1,35 @@
using DigitalData.Core.Abstractions.Client;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
using Microsoft.Extensions.Options;
using System.Net;
namespace DigitalData.Core.Client
{
public static class DIExtensions
{
public static IServiceCollection AddHttpClientService(this IServiceCollection services, string uri)
internal static IServiceCollection AddHttpClientServiceDefaults(this IServiceCollection services)
{
services.TryAddSingleton<HttpClient>();
services.TryAddSingleton<CookieContainer>();
services.AddSingleton<IBaseHttpClientService, BaseHttpClientService>();
services.Configure<HttpClientOptions>(opt => opt.Uri = uri);
return services;
}
public static IServiceCollection AddHttpClientService<TClientOptions>(this IServiceCollection services, Action<TClientOptions>? clientOptions = null, bool setAsDefaultBase = false)
where TClientOptions : HttpClientOptions
public static IServiceCollection AddHttpClientService<THttpClientOptions>(this IServiceCollection services, IConfigurationSection section)
where THttpClientOptions : class, IHttpClientOptions
{
services.TryAddSingleton<HttpClient>();
services.TryAddSingleton<CookieContainer>();
services.AddSingleton<IHttpClientService<TClientOptions>, HttpClientService<TClientOptions>>();
services.Configure(clientOptions ?? (_ => { }));
if (setAsDefaultBase)
services.AddSingleton<IBaseHttpClientService, HttpClientService<TClientOptions>>();
services.AddHttpClientServiceDefaults();
services.TryAddSingleton<IHttpClientService<THttpClientOptions>, HttpClientService<THttpClientOptions>>();
return services.Configure<THttpClientOptions>(section);
}
public static IServiceCollection AddHttpClientService<THttpClientOptions>(this IServiceCollection services, THttpClientOptions options)
where THttpClientOptions : class, IHttpClientOptions
{
services.AddHttpClientServiceDefaults();
services.TryAddSingleton<IHttpClientService<THttpClientOptions>, HttpClientService<THttpClientOptions>>();
services.TryAddSingleton(Options.Create(options));
return services;
}
}

View File

@@ -1,25 +1,35 @@
<Project Sdk="Microsoft.NET.Sdk">
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net7.0</TargetFramework>
<TargetFrameworks>net7.0;net8.0</TargetFrameworks>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<Description>This package provides HTTP client extension methods for the DigitalData.Core library, offering simplified and asynchronous methods for fetching and handling HTTP responses. It includes utility methods for sending GET requests, reading response content as text or JSON, and deserializing JSON into dynamic or strongly-typed objects using Newtonsoft.Json. These extensions facilitate efficient and easy-to-read HTTP interactions in client applications.</Description>
<PackageId>DigitalData.Core.Client</PackageId>
<Version>1.0.1.1</Version>
<Version>2.0.3</Version>
<Authors>Digital Data GmbH</Authors>
<Company>Digital Data GmbH</Company>
<Product>Digital Data GmbH</Product>
<Copyright>Copyright 2024</Copyright>
<PackageProjectUrl></PackageProjectUrl>
<PackageIcon>Assets\icon.png</PackageIcon>
<PackageIcon>core_icon.png</PackageIcon>
<RepositoryUrl>http://git.dd:3000/AppStd/WebCoreModules.git</RepositoryUrl>
<PackageTags>digital data core http client json serilization</PackageTags>
<AssemblyVersion>2.0.3</AssemblyVersion>
<FileVersion>2.0.3</FileVersion>
</PropertyGroup>
<ItemGroup>
<None Include="..\..\nuget-package-icons\core_icon.png">
<Pack>True</Pack>
<PackagePath>\</PackagePath>
</None>
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="7.0.0" />
<PackageReference Include="Microsoft.Extensions.Options" Version="7.0.0" />
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="7.0.0" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
</ItemGroup>

View File

@@ -1,7 +0,0 @@
namespace DigitalData.Core.Client
{
public class HttpClientOptions
{
public string Uri { get; set; } = string.Empty;
}
}

View File

@@ -5,9 +5,9 @@ using System.Net;
namespace DigitalData.Core.Client
{
public class HttpClientService<TClientOptions> : BaseHttpClientService, IHttpClientService<TClientOptions>, IBaseHttpClientService
where TClientOptions : HttpClientOptions
where TClientOptions : class, IHttpClientOptions
{
public HttpClientService(HttpClient client, CookieContainer cookieContainer, IOptions<TClientOptions> clientOptions) : base(client, cookieContainer, clientOptions)
public HttpClientService(HttpClient client, CookieContainer cookieContainer, IOptions<TClientOptions> clientOptions) : base(client, cookieContainer, clientOptions.Value)
{
}
}

View File

@@ -19,7 +19,7 @@ namespace DigitalData.Core.Client
public static T Provide<T>() where T : notnull => _lazyProvider.Value.GetRequiredService<T>();
public static IHttpClientService<TOptions> ProvideHttpClientService<TOptions>() where TOptions : notnull
public static IHttpClientService<TOptions> ProvideHttpClientService<TOptions>() where TOptions : IHttpClientOptions
=> _lazyProvider.Value.GetRequiredService<IHttpClientService<TOptions>>();
}
}

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,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,20 +0,0 @@
using DigitalData.Common.CultureServices;
using DigitalData.Core.Contracts.CultureServices;
using Microsoft.Extensions.DependencyInjection;
namespace DigitalData.Core.CultureServices
{
public static class DIExtensions
{
/// <summary>
/// Registers the KeyTranslationService and its dependencies in the dependency injection container.
/// </summary>
/// <param name="services">The IServiceCollection instance to register the services with.</param>
public static IServiceCollection AddKeyTranslationService(this IServiceCollection services)
{
services.AddTransient<IKeyTranslationService, KeyTranslationService>();
return services;
}
}
}

View File

@@ -1,17 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net7.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Localization" Version="7.0.16" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\DigitalData.Core.Contracts\DigitalData.Core.Contracts.csproj" />
</ItemGroup>
</Project>

View File

@@ -1,20 +0,0 @@
using DigitalData.Core.Contracts.CultureServices;
using Microsoft.Extensions.Localization;
namespace DigitalData.Common.CultureServices
{
public class KeyTranslationService<TResouce> : IKeyTranslationService
{
private readonly IStringLocalizer<TResouce> _localizer;
public KeyTranslationService(IStringLocalizer<TResouce> localizer)
{
_localizer = localizer;
}
public string Translate(string key, params object[] arguments) => _localizer[key, arguments];
public string Translate(Enum key, params object[] arguments) => Translate(key.ToString(), arguments);
}
}

View File

@@ -1,12 +0,0 @@
{
"profiles": {
"DigitalData.Core.CultureServices": {
"commandName": "Project",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
},
"applicationUrl": "https://localhost:61600;http://localhost:61602"
}
}
}

View File

@@ -1,11 +0,0 @@
using DigitalData.Core.Contracts.CultureServices;
namespace DigitalData.Core.CultureServices
{
public static class TranslationExtensions
{
public static string TranslateWith(this string key, IKeyTranslationService keyTranslationService) => keyTranslationService.Translate(key: key);
public static string TranslateWith(this Enum key, IKeyTranslationService keyTranslationService) => keyTranslationService.Translate(key: key);
}
}

View File

@@ -1,576 +0,0 @@
{
"runtimeTarget": {
"name": ".NETCoreApp,Version=v7.0",
"signature": ""
},
"compilationOptions": {},
"targets": {
".NETCoreApp,Version=v7.0": {
"DigitalData.Core.CultureServices/1.0.0": {
"dependencies": {
"Microsoft.Extensions.Localization": "7.0.16",
"WebCore.Contracts": "1.0.1",
"DigitalData.Core.Contracts": "1.0.1.0"
},
"runtime": {
"DigitalData.Core.CultureServices.dll": {}
}
},
"Microsoft.Extensions.Caching.Abstractions/7.0.0": {
"dependencies": {
"Microsoft.Extensions.Primitives": "7.0.0"
},
"runtime": {
"lib/net7.0/Microsoft.Extensions.Caching.Abstractions.dll": {
"assemblyVersion": "7.0.0.0",
"fileVersion": "7.0.22.51805"
}
}
},
"Microsoft.Extensions.Caching.Memory/7.0.0": {
"dependencies": {
"Microsoft.Extensions.Caching.Abstractions": "7.0.0",
"Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0",
"Microsoft.Extensions.Logging.Abstractions": "7.0.1",
"Microsoft.Extensions.Options": "7.0.1",
"Microsoft.Extensions.Primitives": "7.0.0"
},
"runtime": {
"lib/net7.0/Microsoft.Extensions.Caching.Memory.dll": {
"assemblyVersion": "7.0.0.0",
"fileVersion": "7.0.22.51805"
}
}
},
"Microsoft.Extensions.Configuration.Abstractions/7.0.0": {
"dependencies": {
"Microsoft.Extensions.Primitives": "7.0.0"
},
"runtime": {
"lib/net7.0/Microsoft.Extensions.Configuration.Abstractions.dll": {
"assemblyVersion": "7.0.0.0",
"fileVersion": "7.0.22.51805"
}
}
},
"Microsoft.Extensions.Configuration.Binder/7.0.4": {
"dependencies": {
"Microsoft.Extensions.Configuration.Abstractions": "7.0.0"
},
"runtime": {
"lib/net7.0/Microsoft.Extensions.Configuration.Binder.dll": {
"assemblyVersion": "7.0.0.0",
"fileVersion": "7.0.423.11508"
}
}
},
"Microsoft.Extensions.DependencyInjection.Abstractions/7.0.0": {
"runtime": {
"lib/net7.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll": {
"assemblyVersion": "7.0.0.0",
"fileVersion": "7.0.22.51805"
}
}
},
"Microsoft.Extensions.Localization/7.0.16": {
"dependencies": {
"Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0",
"Microsoft.Extensions.Localization.Abstractions": "7.0.16",
"Microsoft.Extensions.Logging.Abstractions": "7.0.1",
"Microsoft.Extensions.Options": "7.0.1"
},
"runtime": {
"lib/net7.0/Microsoft.Extensions.Localization.dll": {
"assemblyVersion": "7.0.0.0",
"fileVersion": "7.0.1624.6815"
}
}
},
"Microsoft.Extensions.Localization.Abstractions/7.0.16": {
"runtime": {
"lib/net7.0/Microsoft.Extensions.Localization.Abstractions.dll": {
"assemblyVersion": "7.0.0.0",
"fileVersion": "7.0.1624.6815"
}
}
},
"Microsoft.Extensions.Logging.Abstractions/7.0.1": {
"runtime": {
"lib/net7.0/Microsoft.Extensions.Logging.Abstractions.dll": {
"assemblyVersion": "7.0.0.0",
"fileVersion": "7.0.723.27404"
}
}
},
"Microsoft.Extensions.Options/7.0.1": {
"dependencies": {
"Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0",
"Microsoft.Extensions.Primitives": "7.0.0"
},
"runtime": {
"lib/net7.0/Microsoft.Extensions.Options.dll": {
"assemblyVersion": "7.0.0.0",
"fileVersion": "7.0.323.6910"
}
}
},
"Microsoft.Extensions.Primitives/7.0.0": {
"runtime": {
"lib/net7.0/Microsoft.Extensions.Primitives.dll": {
"assemblyVersion": "7.0.0.0",
"fileVersion": "7.0.22.51805"
}
}
},
"Microsoft.IdentityModel.Abstractions/7.5.1": {
"runtime": {
"lib/net6.0/Microsoft.IdentityModel.Abstractions.dll": {
"assemblyVersion": "7.5.1.0",
"fileVersion": "7.5.1.50405"
}
}
},
"Microsoft.IdentityModel.JsonWebTokens/7.5.1": {
"dependencies": {
"Microsoft.IdentityModel.Tokens": "7.5.1"
},
"runtime": {
"lib/net6.0/Microsoft.IdentityModel.JsonWebTokens.dll": {
"assemblyVersion": "7.5.1.0",
"fileVersion": "7.5.1.50405"
}
}
},
"Microsoft.IdentityModel.Logging/7.5.1": {
"dependencies": {
"Microsoft.IdentityModel.Abstractions": "7.5.1"
},
"runtime": {
"lib/net6.0/Microsoft.IdentityModel.Logging.dll": {
"assemblyVersion": "7.5.1.0",
"fileVersion": "7.5.1.50405"
}
}
},
"Microsoft.IdentityModel.Tokens/7.5.1": {
"dependencies": {
"Microsoft.IdentityModel.Logging": "7.5.1"
},
"runtime": {
"lib/net6.0/Microsoft.IdentityModel.Tokens.dll": {
"assemblyVersion": "7.5.1.0",
"fileVersion": "7.5.1.50405"
}
}
},
"Microsoft.Win32.SystemEvents/7.0.0": {
"runtime": {
"lib/net7.0/Microsoft.Win32.SystemEvents.dll": {
"assemblyVersion": "7.0.0.0",
"fileVersion": "7.0.22.51805"
}
},
"runtimeTargets": {
"runtimes/win/lib/net7.0/Microsoft.Win32.SystemEvents.dll": {
"rid": "win",
"assetType": "runtime",
"assemblyVersion": "7.0.0.0",
"fileVersion": "7.0.22.51805"
}
}
},
"System.Configuration.ConfigurationManager/7.0.0": {
"dependencies": {
"System.Diagnostics.EventLog": "7.0.0",
"System.Security.Cryptography.ProtectedData": "7.0.0",
"System.Security.Permissions": "7.0.0"
},
"runtime": {
"lib/net7.0/System.Configuration.ConfigurationManager.dll": {
"assemblyVersion": "7.0.0.0",
"fileVersion": "7.0.22.51805"
}
}
},
"System.Diagnostics.EventLog/7.0.0": {
"runtime": {
"lib/net7.0/System.Diagnostics.EventLog.dll": {
"assemblyVersion": "7.0.0.0",
"fileVersion": "7.0.22.51805"
}
},
"runtimeTargets": {
"runtimes/win/lib/net7.0/System.Diagnostics.EventLog.Messages.dll": {
"rid": "win",
"assetType": "runtime",
"assemblyVersion": "7.0.0.0",
"fileVersion": "0.0.0.0"
},
"runtimes/win/lib/net7.0/System.Diagnostics.EventLog.dll": {
"rid": "win",
"assetType": "runtime",
"assemblyVersion": "7.0.0.0",
"fileVersion": "7.0.22.51805"
}
}
},
"System.DirectoryServices/7.0.1": {
"dependencies": {
"System.Security.Permissions": "7.0.0"
},
"runtime": {
"lib/net7.0/System.DirectoryServices.dll": {
"assemblyVersion": "4.0.0.0",
"fileVersion": "7.0.323.6910"
}
},
"runtimeTargets": {
"runtimes/win/lib/net7.0/System.DirectoryServices.dll": {
"rid": "win",
"assetType": "runtime",
"assemblyVersion": "4.0.0.0",
"fileVersion": "7.0.323.6910"
}
}
},
"System.DirectoryServices.AccountManagement/7.0.1": {
"dependencies": {
"System.Configuration.ConfigurationManager": "7.0.0",
"System.DirectoryServices": "7.0.1",
"System.DirectoryServices.Protocols": "7.0.1"
},
"runtime": {
"lib/net7.0/System.DirectoryServices.AccountManagement.dll": {
"assemblyVersion": "4.0.0.0",
"fileVersion": "7.0.1123.42427"
}
},
"runtimeTargets": {
"runtimes/win/lib/net7.0/System.DirectoryServices.AccountManagement.dll": {
"rid": "win",
"assetType": "runtime",
"assemblyVersion": "4.0.0.0",
"fileVersion": "7.0.1123.42427"
}
}
},
"System.DirectoryServices.Protocols/7.0.1": {
"runtime": {
"lib/net7.0/System.DirectoryServices.Protocols.dll": {
"assemblyVersion": "7.0.0.1",
"fileVersion": "7.0.723.27404"
}
},
"runtimeTargets": {
"runtimes/linux/lib/net7.0/System.DirectoryServices.Protocols.dll": {
"rid": "linux",
"assetType": "runtime",
"assemblyVersion": "7.0.0.1",
"fileVersion": "7.0.723.27404"
},
"runtimes/osx/lib/net7.0/System.DirectoryServices.Protocols.dll": {
"rid": "osx",
"assetType": "runtime",
"assemblyVersion": "7.0.0.1",
"fileVersion": "7.0.723.27404"
},
"runtimes/win/lib/net7.0/System.DirectoryServices.Protocols.dll": {
"rid": "win",
"assetType": "runtime",
"assemblyVersion": "7.0.0.1",
"fileVersion": "7.0.723.27404"
}
}
},
"System.Drawing.Common/7.0.0": {
"dependencies": {
"Microsoft.Win32.SystemEvents": "7.0.0"
},
"runtime": {
"lib/net7.0/System.Drawing.Common.dll": {
"assemblyVersion": "7.0.0.0",
"fileVersion": "7.0.22.51805"
}
},
"runtimeTargets": {
"runtimes/win/lib/net7.0/System.Drawing.Common.dll": {
"rid": "win",
"assetType": "runtime",
"assemblyVersion": "7.0.0.0",
"fileVersion": "7.0.22.51805"
}
}
},
"System.IdentityModel.Tokens.Jwt/7.5.1": {
"dependencies": {
"Microsoft.IdentityModel.JsonWebTokens": "7.5.1",
"Microsoft.IdentityModel.Tokens": "7.5.1"
},
"runtime": {
"lib/net6.0/System.IdentityModel.Tokens.Jwt.dll": {
"assemblyVersion": "7.5.1.0",
"fileVersion": "7.5.1.50405"
}
}
},
"System.Security.Cryptography.ProtectedData/7.0.0": {
"runtime": {
"lib/net7.0/System.Security.Cryptography.ProtectedData.dll": {
"assemblyVersion": "7.0.0.0",
"fileVersion": "7.0.22.51805"
}
},
"runtimeTargets": {
"runtimes/win/lib/net7.0/System.Security.Cryptography.ProtectedData.dll": {
"rid": "win",
"assetType": "runtime",
"assemblyVersion": "7.0.0.0",
"fileVersion": "7.0.22.51805"
}
}
},
"System.Security.Permissions/7.0.0": {
"dependencies": {
"System.Windows.Extensions": "7.0.0"
},
"runtime": {
"lib/net7.0/System.Security.Permissions.dll": {
"assemblyVersion": "7.0.0.0",
"fileVersion": "7.0.22.51805"
}
}
},
"System.Windows.Extensions/7.0.0": {
"dependencies": {
"System.Drawing.Common": "7.0.0"
},
"runtime": {
"lib/net7.0/System.Windows.Extensions.dll": {
"assemblyVersion": "7.0.0.0",
"fileVersion": "7.0.22.51805"
}
},
"runtimeTargets": {
"runtimes/win/lib/net7.0/System.Windows.Extensions.dll": {
"rid": "win",
"assetType": "runtime",
"assemblyVersion": "7.0.0.0",
"fileVersion": "7.0.22.51805"
}
}
},
"WebCore.Contracts/1.0.1": {
"dependencies": {
"Microsoft.Extensions.Caching.Memory": "7.0.0",
"Microsoft.Extensions.Configuration.Binder": "7.0.4",
"System.DirectoryServices": "7.0.1",
"System.DirectoryServices.AccountManagement": "7.0.1",
"System.IdentityModel.Tokens.Jwt": "7.5.1"
},
"runtime": {
"DigitalData.Core.Contracts.dll": {}
}
},
"DigitalData.Core.Contracts/1.0.1.0": {
"runtime": {
"DigitalData.Core.Contracts.dll": {
"assemblyVersion": "1.0.1.0",
"fileVersion": "1.0.1.0"
}
}
}
}
},
"libraries": {
"DigitalData.Core.CultureServices/1.0.0": {
"type": "project",
"serviceable": false,
"sha512": ""
},
"Microsoft.Extensions.Caching.Abstractions/7.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-IeimUd0TNbhB4ded3AbgBLQv2SnsiVugDyGV1MvspQFVlA07nDC7Zul7kcwH5jWN3JiTcp/ySE83AIJo8yfKjg==",
"path": "microsoft.extensions.caching.abstractions/7.0.0",
"hashPath": "microsoft.extensions.caching.abstractions.7.0.0.nupkg.sha512"
},
"Microsoft.Extensions.Caching.Memory/7.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-xpidBs2KCE2gw1JrD0quHE72kvCaI3xFql5/Peb2GRtUuZX+dYPoK/NTdVMiM67Svym0M0Df9A3xyU0FbMQhHw==",
"path": "microsoft.extensions.caching.memory/7.0.0",
"hashPath": "microsoft.extensions.caching.memory.7.0.0.nupkg.sha512"
},
"Microsoft.Extensions.Configuration.Abstractions/7.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-f34u2eaqIjNO9YLHBz8rozVZ+TcFiFs0F3r7nUJd7FRkVSxk8u4OpoK226mi49MwexHOR2ibP9MFvRUaLilcQQ==",
"path": "microsoft.extensions.configuration.abstractions/7.0.0",
"hashPath": "microsoft.extensions.configuration.abstractions.7.0.0.nupkg.sha512"
},
"Microsoft.Extensions.Configuration.Binder/7.0.4": {
"type": "package",
"serviceable": true,
"sha512": "sha512-8+XPvJnHZsYgHOQlcMuQe7QNF5KdVKHH1F/wW3nd8/u81Gk/XFAYMDP0Lpz18h7/AM95M662vvqMorcYxCBB4w==",
"path": "microsoft.extensions.configuration.binder/7.0.4",
"hashPath": "microsoft.extensions.configuration.binder.7.0.4.nupkg.sha512"
},
"Microsoft.Extensions.DependencyInjection.Abstractions/7.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-h3j/QfmFN4S0w4C2A6X7arXij/M/OVw3uQHSOFxnND4DyAzO1F9eMX7Eti7lU/OkSthEE0WzRsfT/Dmx86jzCw==",
"path": "microsoft.extensions.dependencyinjection.abstractions/7.0.0",
"hashPath": "microsoft.extensions.dependencyinjection.abstractions.7.0.0.nupkg.sha512"
},
"Microsoft.Extensions.Localization/7.0.16": {
"type": "package",
"serviceable": true,
"sha512": "sha512-JpTQ/El4m/Yfup+sgwvp8qtYAoxEYe9wXy63gw/KXep8bzUdA1wfReed0rL2UqR9Uk7hDnjfYFCz190B2fBYdA==",
"path": "microsoft.extensions.localization/7.0.16",
"hashPath": "microsoft.extensions.localization.7.0.16.nupkg.sha512"
},
"Microsoft.Extensions.Localization.Abstractions/7.0.16": {
"type": "package",
"serviceable": true,
"sha512": "sha512-wUwfDVcOMRUZv+zX45Vyh/MkXpdOy7nIvRRf3n2iiYoh76M0Dr/wx8Ppxk3v9H556z2e0QwLVQqqkd+oj+CGRQ==",
"path": "microsoft.extensions.localization.abstractions/7.0.16",
"hashPath": "microsoft.extensions.localization.abstractions.7.0.16.nupkg.sha512"
},
"Microsoft.Extensions.Logging.Abstractions/7.0.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-pkeBFx0vqMW/A3aUVHh7MPu3WkBhaVlezhSZeb1c9XD0vUReYH1TLFSy5MxJgZfmz5LZzYoErMorlYZiwpOoNA==",
"path": "microsoft.extensions.logging.abstractions/7.0.1",
"hashPath": "microsoft.extensions.logging.abstractions.7.0.1.nupkg.sha512"
},
"Microsoft.Extensions.Options/7.0.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-pZRDYdN1FpepOIfHU62QoBQ6zdAoTvnjxFfqAzEd9Jhb2dfhA5i6jeTdgGgcgTWFRC7oT0+3XrbQu4LjvgX1Nw==",
"path": "microsoft.extensions.options/7.0.1",
"hashPath": "microsoft.extensions.options.7.0.1.nupkg.sha512"
},
"Microsoft.Extensions.Primitives/7.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-um1KU5kxcRp3CNuI8o/GrZtD4AIOXDk+RLsytjZ9QPok3ttLUelLKpilVPuaFT3TFjOhSibUAso0odbOaCDj3Q==",
"path": "microsoft.extensions.primitives/7.0.0",
"hashPath": "microsoft.extensions.primitives.7.0.0.nupkg.sha512"
},
"Microsoft.IdentityModel.Abstractions/7.5.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-PT16ZFbPIiMsYv07oy3zOjqUOJ7xutGBkJTOX0+IbNyU6+O6X7aIxjq9EaSSRLWbekRgamgtmfg8Xjw6A6Ua9g==",
"path": "microsoft.identitymodel.abstractions/7.5.1",
"hashPath": "microsoft.identitymodel.abstractions.7.5.1.nupkg.sha512"
},
"Microsoft.IdentityModel.JsonWebTokens/7.5.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-93CGSa8RPdZU8zfvA3nf9NGKUqEnQrE12VzYlMqKh72ddhzusosqLNEUgH/YhFWBLRFOnY1RCgHMV7pR+sAx2w==",
"path": "microsoft.identitymodel.jsonwebtokens/7.5.1",
"hashPath": "microsoft.identitymodel.jsonwebtokens.7.5.1.nupkg.sha512"
},
"Microsoft.IdentityModel.Logging/7.5.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-PnpAQX20BAiDIPYmWUyQSlEaWD8BLXzHpiDGTCT568Cs0ReOeyzNe401LzCeiv6ilug/KefVeV1CeqtCHTo8dw==",
"path": "microsoft.identitymodel.logging/7.5.1",
"hashPath": "microsoft.identitymodel.logging.7.5.1.nupkg.sha512"
},
"Microsoft.IdentityModel.Tokens/7.5.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-Q3DKpyFViP84IUlTFKH/zIkswIrmSh2Vd/eFDo4wlOHy4DYxoweZEEw4kDEiKt9VCX6o7SddK3HK2xDYyFpexA==",
"path": "microsoft.identitymodel.tokens/7.5.1",
"hashPath": "microsoft.identitymodel.tokens.7.5.1.nupkg.sha512"
},
"Microsoft.Win32.SystemEvents/7.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-2nXPrhdAyAzir0gLl8Yy8S5Mnm/uBSQQA7jEsILOS1MTyS7DbmV1NgViMtvV1sfCD1ebITpNwb1NIinKeJgUVQ==",
"path": "microsoft.win32.systemevents/7.0.0",
"hashPath": "microsoft.win32.systemevents.7.0.0.nupkg.sha512"
},
"System.Configuration.ConfigurationManager/7.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-WvRUdlL1lB0dTRZSs5XcQOd5q9MYNk90GkbmRmiCvRHThWiojkpGqWdmEDJdXyHbxG/BhE5hmVbMfRLXW9FJVA==",
"path": "system.configuration.configurationmanager/7.0.0",
"hashPath": "system.configuration.configurationmanager.7.0.0.nupkg.sha512"
},
"System.Diagnostics.EventLog/7.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-eUDP47obqQm3SFJfP6z+Fx2nJ4KKTQbXB4Q9Uesnzw9SbYdhjyoGXuvDn/gEmFY6N5Z3bFFbpAQGA7m6hrYJCw==",
"path": "system.diagnostics.eventlog/7.0.0",
"hashPath": "system.diagnostics.eventlog.7.0.0.nupkg.sha512"
},
"System.DirectoryServices/7.0.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-Z4FVdUJEVXbf7/f/hU6cFZDtxN5ozUVKJMzXoHmC+GCeTcqzlxqmWtxurejxG3K+kZ6H0UKwNshoK1CYnmJ1sg==",
"path": "system.directoryservices/7.0.1",
"hashPath": "system.directoryservices.7.0.1.nupkg.sha512"
},
"System.DirectoryServices.AccountManagement/7.0.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-UNytHYwA5IF55WQhashsMG57ize83JUGJxD8YJlOyO9ZlMTOD4Nt7y+A6mvmrU/swDoYWaVL+TNwE6hk9lyvbA==",
"path": "system.directoryservices.accountmanagement/7.0.1",
"hashPath": "system.directoryservices.accountmanagement.7.0.1.nupkg.sha512"
},
"System.DirectoryServices.Protocols/7.0.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-t9hsL+UYRzNs30pnT2Tdx6ngX8McFUjru0a0ekNgu/YXfkXN+dx5OvSEv0/p7H2q3pdJLH7TJPWX7e55J8QB9A==",
"path": "system.directoryservices.protocols/7.0.1",
"hashPath": "system.directoryservices.protocols.7.0.1.nupkg.sha512"
},
"System.Drawing.Common/7.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-KIX+oBU38pxkKPxvLcLfIkOV5Ien8ReN78wro7OF5/erwcmortzeFx+iBswlh2Vz6gVne0khocQudGwaO1Ey6A==",
"path": "system.drawing.common/7.0.0",
"hashPath": "system.drawing.common.7.0.0.nupkg.sha512"
},
"System.IdentityModel.Tokens.Jwt/7.5.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-UUw+E0R73lZLlXgneYIJQxNs1kfbcxjVzw64JQyiwjqCd4HMpAbjn+xRo86QZT84uHq8/MkqvfH82tgjgPzpuw==",
"path": "system.identitymodel.tokens.jwt/7.5.1",
"hashPath": "system.identitymodel.tokens.jwt.7.5.1.nupkg.sha512"
},
"System.Security.Cryptography.ProtectedData/7.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-xSPiLNlHT6wAHtugASbKAJwV5GVqQK351crnILAucUioFqqieDN79evO1rku1ckt/GfjIn+b17UaSskoY03JuA==",
"path": "system.security.cryptography.protecteddata/7.0.0",
"hashPath": "system.security.cryptography.protecteddata.7.0.0.nupkg.sha512"
},
"System.Security.Permissions/7.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-Vmp0iRmCEno9BWiskOW5pxJ3d9n+jUqKxvX4GhLwFhnQaySZmBN2FuC0N5gjFHgyFMUjC5sfIJ8KZfoJwkcMmA==",
"path": "system.security.permissions/7.0.0",
"hashPath": "system.security.permissions.7.0.0.nupkg.sha512"
},
"System.Windows.Extensions/7.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-bR4qdCmssMMbo9Fatci49An5B1UaVJZHKNq70PRgzoLYIlitb8Tj7ns/Xt5Pz1CkERiTjcVBDU2y1AVrPBYkaw==",
"path": "system.windows.extensions/7.0.0",
"hashPath": "system.windows.extensions.7.0.0.nupkg.sha512"
},
"WebCore.Contracts/1.0.1": {
"type": "project",
"serviceable": false,
"sha512": ""
},
"DigitalData.Core.Contracts/1.0.1.0": {
"type": "reference",
"serviceable": false,
"sha512": ""
}
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

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,170 +0,0 @@
{
"format": 1,
"restore": {
"E:\\TekH\\Visual Studio\\WebCoreModules\\DigitalData.Core.CultureServices\\DigitalData.Core.CultureServices.csproj": {}
},
"projects": {
"E:\\TekH\\Visual Studio\\WebCoreModules\\DigitalData.Core.Contracts\\DigitalData.Core.Contracts.csproj": {
"version": "1.0.1",
"restore": {
"projectUniqueName": "E:\\TekH\\Visual Studio\\WebCoreModules\\DigitalData.Core.Contracts\\DigitalData.Core.Contracts.csproj",
"projectName": "WebCore.Contracts",
"projectPath": "E:\\TekH\\Visual Studio\\WebCoreModules\\DigitalData.Core.Contracts\\DigitalData.Core.Contracts.csproj",
"packagesPath": "C:\\Users\\tekh\\.nuget\\packages\\",
"outputPath": "E:\\TekH\\Visual Studio\\WebCoreModules\\DigitalData.Core.Contracts\\obj\\",
"projectStyle": "PackageReference",
"fallbackFolders": [
"D:\\ProgramFiles\\DevExpress 21.2\\Components\\Offline Packages"
],
"configFilePaths": [
"C:\\Users\\tekh\\AppData\\Roaming\\NuGet\\NuGet.Config",
"C:\\Program Files (x86)\\NuGet\\Config\\DevExpress 21.2.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 21.2\\Components\\System\\Components\\Packages": {},
"https://api.nuget.org/v3/index.json": {}
},
"frameworks": {
"net7.0": {
"targetAlias": "net7.0",
"projectReferences": {}
}
},
"warningProperties": {
"warnAsError": [
"NU1605"
]
},
"restoreAuditProperties": {
"enableAudit": "true",
"auditLevel": "low",
"auditMode": "direct"
}
},
"frameworks": {
"net7.0": {
"targetAlias": "net7.0",
"dependencies": {
"Microsoft.Extensions.Caching.Memory": {
"target": "Package",
"version": "[7.0.0, )"
},
"Microsoft.Extensions.Configuration.Binder": {
"target": "Package",
"version": "[7.0.4, )"
},
"System.DirectoryServices": {
"target": "Package",
"version": "[7.0.1, )"
},
"System.DirectoryServices.AccountManagement": {
"target": "Package",
"version": "[7.0.1, )"
},
"System.IdentityModel.Tokens.Jwt": {
"target": "Package",
"version": "[7.5.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\\8.0.200\\RuntimeIdentifierGraph.json"
}
}
},
"E:\\TekH\\Visual Studio\\WebCoreModules\\DigitalData.Core.CultureServices\\DigitalData.Core.CultureServices.csproj": {
"version": "1.0.0",
"restore": {
"projectUniqueName": "E:\\TekH\\Visual Studio\\WebCoreModules\\DigitalData.Core.CultureServices\\DigitalData.Core.CultureServices.csproj",
"projectName": "DigitalData.Core.CultureServices",
"projectPath": "E:\\TekH\\Visual Studio\\WebCoreModules\\DigitalData.Core.CultureServices\\DigitalData.Core.CultureServices.csproj",
"packagesPath": "C:\\Users\\tekh\\.nuget\\packages\\",
"outputPath": "E:\\TekH\\Visual Studio\\WebCoreModules\\DigitalData.Core.CultureServices\\obj\\",
"projectStyle": "PackageReference",
"fallbackFolders": [
"D:\\ProgramFiles\\DevExpress 21.2\\Components\\Offline Packages"
],
"configFilePaths": [
"C:\\Users\\tekh\\AppData\\Roaming\\NuGet\\NuGet.Config",
"C:\\Program Files (x86)\\NuGet\\Config\\DevExpress 21.2.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 21.2\\Components\\System\\Components\\Packages": {},
"https://api.nuget.org/v3/index.json": {}
},
"frameworks": {
"net7.0": {
"targetAlias": "net7.0",
"projectReferences": {
"E:\\TekH\\Visual Studio\\WebCoreModules\\DigitalData.Core.Contracts\\DigitalData.Core.Contracts.csproj": {
"projectPath": "E:\\TekH\\Visual Studio\\WebCoreModules\\DigitalData.Core.Contracts\\DigitalData.Core.Contracts.csproj"
}
}
}
},
"warningProperties": {
"warnAsError": [
"NU1605"
]
},
"restoreAuditProperties": {
"enableAudit": "true",
"auditLevel": "low",
"auditMode": "direct"
}
},
"frameworks": {
"net7.0": {
"targetAlias": "net7.0",
"dependencies": {
"Microsoft.Extensions.Localization": {
"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\\8.0.200\\RuntimeIdentifierGraph.json"
}
}
}
}
}

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,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.1\buildTransitive\net6.0\Microsoft.Extensions.Logging.Abstractions.targets" Condition="Exists('$(NuGetPackageRoot)microsoft.extensions.logging.abstractions\7.0.1\buildTransitive\net6.0\Microsoft.Extensions.Logging.Abstractions.targets')" />
</ImportGroup>
</Project>

View File

@@ -1,19 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2012/06/nuspec.xsd">
<metadata>
<id>DigitalData.Core.CultureServices</id>
<version>1.0.0</version>
<authors>DigitalData.Core.CultureServices</authors>
<description>Package Description</description>
<repository type="git" commit="82da3586a5e28ae5fbd4242f05f60f9e5327e5f2" />
<dependencies>
<group targetFramework="net7.0">
<dependency id="WebCore.Contracts" version="1.0.1" exclude="Build,Analyzers" />
<dependency id="Microsoft.Extensions.Localization" version="7.0.16" exclude="Build,Analyzers" />
</group>
</dependencies>
</metadata>
<files>
<file src="E:\TekH\Visual Studio\WebCoreModules\DigitalData.Core.CultureServices\bin\Release\net7.0\DigitalData.Core.CultureServices.dll" target="lib\net7.0\DigitalData.Core.CultureServices.dll" />
</files>
</package>

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.CultureServices
build_property.ProjectDir = E:\TekH\Visual Studio\WebCoreModules\DigitalData.Core.CultureServices\
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 +0,0 @@
36fef0fd26a832d2188715455582d92b1504d333459c8ca9de1908bace5726e0

View File

@@ -1,16 +0,0 @@
E:\TekH\Visual Studio\WebCoreModules\DigitalData.Core.CultureServices\bin\Release\net7.0\DigitalData.Core.CultureServices.deps.json
E:\TekH\Visual Studio\WebCoreModules\DigitalData.Core.CultureServices\bin\Release\net7.0\DigitalData.Core.CultureServices.dll
E:\TekH\Visual Studio\WebCoreModules\DigitalData.Core.CultureServices\bin\Release\net7.0\DigitalData.Core.CultureServices.pdb
E:\TekH\Visual Studio\WebCoreModules\DigitalData.Core.CultureServices\bin\Release\net7.0\DigitalData.Core.Contracts.dll
E:\TekH\Visual Studio\WebCoreModules\DigitalData.Core.CultureServices\bin\Release\net7.0\DigitalData.Core.Contracts.pdb
E:\TekH\Visual Studio\WebCoreModules\DigitalData.Core.CultureServices\obj\Release\net7.0\DigitalData.Core.CultureServices.csproj.AssemblyReference.cache
E:\TekH\Visual Studio\WebCoreModules\DigitalData.Core.CultureServices\obj\Release\net7.0\DigitalData.Core.CultureServices.GeneratedMSBuildEditorConfig.editorconfig
E:\TekH\Visual Studio\WebCoreModules\DigitalData.Core.CultureServices\obj\Release\net7.0\DigitalData.Core.CultureServices.AssemblyInfoInputs.cache
E:\TekH\Visual Studio\WebCoreModules\DigitalData.Core.CultureServices\obj\Release\net7.0\DigitalData.Core.CultureServices.AssemblyInfo.cs
E:\TekH\Visual Studio\WebCoreModules\DigitalData.Core.CultureServices\obj\Release\net7.0\DigitalData.Core.CultureServices.csproj.CoreCompileInputs.cache
E:\TekH\Visual Studio\WebCoreModules\DigitalData.Core.CultureServices\obj\Release\net7.0\DigitalD.489AA3D4.Up2Date
E:\TekH\Visual Studio\WebCoreModules\DigitalData.Core.CultureServices\obj\Release\net7.0\DigitalData.Core.CultureServices.dll
E:\TekH\Visual Studio\WebCoreModules\DigitalData.Core.CultureServices\obj\Release\net7.0\refint\DigitalData.Core.CultureServices.dll
E:\TekH\Visual Studio\WebCoreModules\DigitalData.Core.CultureServices\obj\Release\net7.0\DigitalData.Core.CultureServices.pdb
E:\TekH\Visual Studio\WebCoreModules\DigitalData.Core.CultureServices\obj\Release\net7.0\ref\DigitalData.Core.CultureServices.dll
E:\TekH\Visual Studio\WebCoreModules\DigitalData.Core.CultureServices\bin\Release\net7.0\icon.png

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1020 KiB

View File

@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net7.0</TargetFramework>
<TargetFrameworks>net7.0;net8.0</TargetFrameworks>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<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>
@@ -12,13 +12,13 @@
<Company>Digital Data GmbH</Company>
<Product>DigitalData.Core.DTO</Product>
<Copyright>Copyright 2024</Copyright>
<PackageIcon>icon.png</PackageIcon>
<PackageIcon>core_icon.png</PackageIcon>
<RepositoryUrl>http://git.dd:3000/AppStd/WebCoreModules.git</RepositoryUrl>
<PackageTags>digital data core dto clean architecture result pattern</PackageTags>
</PropertyGroup>
<ItemGroup>
<None Include="..\DigitalData.Core.Abstractions\Assets\icon.png">
<None Include="..\..\nuget-package-icons\core_icon.png">
<Pack>True</Pack>
<PackagePath>\</PackagePath>
</None>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1020 KiB

View File

@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net7.0</TargetFramework>
<TargetFrameworks>net7.0;net8.0</TargetFrameworks>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<GeneratePackageOnBuild>True</GeneratePackageOnBuild>
@@ -12,14 +12,14 @@
<Product>DigitalData.Core.Infrastructure</Product>
<Description>This package provides implementations for data access and other low-level services within the DigitalData.Core.Abstractions library. It includes generic CRUD operations using Entity Framework Core, database context management, and other infrastructure-related functionalities, adhering to Clean Architecture principles to ensure separation of concerns and maintainability.</Description>
<Copyright>Copyright 2024</Copyright>
<PackageIcon>icon.png</PackageIcon>
<PackageIcon>core_icon.png</PackageIcon>
<RepositoryUrl>http://git.dd:3000/AppStd/WebCoreModules.git</RepositoryUrl>
<RepositoryType>digital data core abstractions clean architecture</RepositoryType>
<PackageTags>digital data core infrastructure clean architecture</PackageTags>
</PropertyGroup>
<ItemGroup>
<None Include="..\DigitalData.Core.Abstractions\Assets\icon.png">
<None Include="..\..\nuget-package-icons\core_icon.png">
<Pack>True</Pack>
<PackagePath>\</PackagePath>
</None>

View File

@@ -13,7 +13,10 @@
<SourceRoot Include="C:\Users\tekh\.nuget\packages\" />
<SourceRoot Include="D:\ProgramFiles\DevExpress 21.2\Components\Offline Packages\" />
</ItemGroup>
<ImportGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<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,6 +1,9 @@
<?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' ">
<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

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

View File

@@ -0,0 +1,104 @@
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

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

View File

@@ -0,0 +1,9 @@
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

@@ -0,0 +1,59 @@
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,38 @@
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();
}
}
}

View File

@@ -0,0 +1,71 @@
using DigitalData.Core.Abstractions.Security;
using DigitalData.Core.Security.Config;
using DigitalData.Core.Security.RSAKey;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using System.Security.Claims;
namespace DigitalData.Core.Security
{
public static class DIExtensions
{
private static IServiceCollection AddParamsConfigureOptions<TParams>(this IServiceCollection services) where TParams : RSAFactoryParams
=> services.AddSingleton<IConfigureOptions<TParams>, ParamsConfigureOptions<TParams>>();
private static IServiceCollection AddCryptoFactory(this IServiceCollection services) => services
.AddParamsConfigureOptions<CryptoFactoryParams>()
.AddAutoMapper(typeof(MappingProfile).Assembly)
.AddSingleton<ICryptoFactory, CryptoFactory>();
/// <summary>
/// Registers a custom asym crypt service with specified parameters from the given configuration section.
/// </summary>
/// <param name="services"></param>
/// <param name="section"></param>
/// <returns>The updated <see cref="IServiceCollection"/> with the RSA Factory registered.</returns>
public static IServiceCollection AddCryptoFactory(this IServiceCollection services, IConfigurationSection section) => services
.Configure<CryptoFactoryParams>(section)
.AddCryptoFactory();
/// <summary>
/// Registers an asym crypt service with the specified parameters from the given instance.
/// </summary>
/// <param name="services"></param>
/// <returns>The updated <see cref="IServiceCollection"/> with the RSA Factory registered.</returns>
public static IServiceCollection AddCryptoFactory(this IServiceCollection services, CryptoFactoryParams? factoryParams = null) => services
.AddSingleton(Options.Create(factoryParams ?? new()))
.AddCryptoFactory();
/// <summary>
/// Registers a custom RSA Factory with specified parameters from the given configuration section.
/// </summary>
/// <param name="services"></param>
/// <param name="section"></param>
/// <returns>The updated <see cref="IServiceCollection"/> with the RSA Factory registered.</returns>
public static IServiceCollection AddRSAFactory(this IServiceCollection services, IConfigurationSection section) => services
.AddParamsConfigureOptions<RSAFactoryParams>()
.Configure<RSAFactoryParams>(section)
.AddSingleton<IAsymmetricKeyFactory, RSAFactory<RSAFactoryParams>>();
private static IServiceCollection AddClaimDescriptor<TPrincipal>(this IServiceCollection services,
Func<TPrincipal, IDictionary<string, object>>? claimsMapper = null,
Func<TPrincipal, ClaimsIdentity>? subjectMapper = null)
{
var descriptor = new ClaimDescriptor<TPrincipal>
{
CreateClaims = claimsMapper,
CreateSubject = subjectMapper
};
return services.AddSingleton(sp => Options.Create(descriptor));
}
public static IServiceCollection AddJwtSignatureHandler<TPrincipal>(this IServiceCollection services,
Func<TPrincipal, IDictionary<string, object>>? claimsMapper = null,
Func<TPrincipal, ClaimsIdentity>? subjectMapper = null)
=> services
.AddClaimDescriptor(claimsMapper: claimsMapper, subjectMapper: subjectMapper)
.AddSingleton<IJwtSignatureHandler<TPrincipal>, JwtSignatureHandler<TPrincipal>>();
}
}

View File

@@ -0,0 +1,38 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>net7.0;net8.0</TargetFrameworks>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<PackageId>DigitalData.Core.Security</PackageId>
<Version>1.0.0</Version>
<Company>Digital Data GmbH</Company>
<Product>Digital Data GmbH</Product>
<Description>This package provides RSA-based security functionalities as an implementation of the DigitalData.Core.Abstractions.Security library. It supports robust encryption and decryption operations, as well as JWT signing and validation for secure authentication and data integrity.</Description>
<Authors>Digital Data GmbH</Authors>
<Copyright>Copyright 2025</Copyright>
<PackageProjectUrl></PackageProjectUrl>
<PackageIcon>core_icon.png</PackageIcon>
<RepositoryUrl>http://git.dd:3000/AppStd/WebCoreModules.git</RepositoryUrl>
<PackageTags>digital data core security</PackageTags>
<AssemblyVersion>1.0.0</AssemblyVersion>
<FileVersion>1.0.0</FileVersion>
</PropertyGroup>
<ItemGroup>
<None Include="..\..\nuget-package-icons\core_icon.png">
<Pack>True</Pack>
<PackagePath>\</PackagePath>
</None>
</ItemGroup>
<ItemGroup>
<PackageReference Include="AutoMapper" Version="13.0.1" />
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="8.0.0" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\DigitalData.Core.Abstractions\DigitalData.Core.Abstractions.csproj" />
</ItemGroup>
</Project>

View File

@@ -0,0 +1,89 @@
using AutoMapper;
using DigitalData.Core.Abstractions.Security;
using Microsoft.IdentityModel.Tokens;
namespace DigitalData.Core.Security
{
internal static class Extension
{
/// <summary>
/// Converts a <see cref="DateTime"/> to a formatted string based on the specified format string.
/// <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 />
/// </summary>
/// <param name="date">The <see cref="DateTime"/> value to be formatted.</param>
/// <param name="format">The format string that dictates the formatting of the date. If the format includes the "//" symbol,
/// it splits the string at "//" and divides the left-side value by the right-side value. The format string can include standard
/// <see cref="DateTime.ToString"/> format patterns.</param>
/// <returns>A string representation of the formatted date, or the result of the division operation if "//" is present in the format.</returns>
/// <exception cref="ArgumentException">Thrown if the format string is invalid, such as having an incorrect number of parts after "//".</exception>
/// <exception cref="DivideByZeroException">Thrown if the right side of the "//" contains a zero, resulting in division by zero.</exception>
/// <exception cref="FormatException">Thrown if either the left-side or right-side value of "//" cannot be parsed as an integer.</exception>
internal static string ToTag(this DateTime date, string format)
{
if (format is not null && format.Contains("//"))
{
var subStrings = format.Split("//");
if (subStrings.Length != 2)
throw new ArgumentException($"Date tag format {format} is invalid. It must contain exactly one '//' separator.", nameof(format));
var formattedLeft = date.ToString(subStrings[0]);
if (!int.TryParse(formattedLeft, out var dateValue))
throw new FormatException($"The left-side value ({formattedLeft}) of the format could not be parsed to an integer.");
if (!int.TryParse(subStrings[1], out var divisor))
throw new FormatException($"The right-side value ({divisor}) of the format could not be parsed to an integer.");
if (divisor == 0)
throw new DivideByZeroException($"Date tag format {format} includes division by zero, which is not allowed.");
var result = (dateValue - 1) / divisor + 1;
return result.ToString();
}
return date.ToString(format);
}
/// <summary>
/// Converts a <see cref="DateTime"/> to a formatted string based on the specified format string.
/// <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>
/// <param name="date">The <see cref="DateOnly"/> value to be formatted. It will convert to DateTime to use the method shared with DateTime.</param>
/// <param name="format">The format string that dictates the formatting of the date. If the format includes the "//" symbol,
/// it splits the string at "//" and divides the left-side value by the right-side value. The format string can include standard
/// <see cref="DateTime.ToString"/> format patterns.</param>
/// <returns>A string representation of the formatted date, or the result of the division operation if "//" is present in the format.</returns>
/// <exception cref="ArgumentException">Thrown if the format string is invalid, such as having an incorrect number of parts after "//".</exception>
/// <exception cref="DivideByZeroException">Thrown if the right side of the "//" contains a zero, resulting in division by zero.</exception>
/// <exception cref="FormatException">Thrown if either the left-side or right-side value of "//" cannot be parsed as an integer.</exception>
internal static string ToTag(this DateOnly date, string format) => date.ToDateTime(new()).ToTag(format);
/// <summary>
/// Maps a <see cref="RSATokenDescriptor"/> to a <see cref="SecurityTokenDescriptor"/>.
/// </summary>
/// <param name="mapper">The <see cref="IMapper"/> instance used for mapping.</param>
/// <param name="description">The <see cref="RSATokenDescriptor"/> instance to be mapped.</param>
/// <returns>A <see cref="SecurityTokenDescriptor"/> instance populated with the mapped values.</returns>
/// <exception cref="ArgumentNullException">Thrown if <paramref name="mapper"/> or <paramref name="description"/> is <c>null</c>.</exception>
internal static SecurityTokenDescriptor Map(this IMapper mapper, IAsymmetricTokenDescriptor description)
=> mapper.Map(description, new SecurityTokenDescriptor());
}
}

View File

@@ -0,0 +1,8 @@
// This file is used by Code Analysis to maintain SuppressMessage
// attributes that are applied to this project.
// Project-level suppressions either have no target or are given
// a specific target and scoped to a namespace, type, member, etc.
using System.Diagnostics.CodeAnalysis;
[assembly: SuppressMessage("Style", "IDE0290:Use primary constructor", Justification = "<Pending>", Scope = "member", Target = "~M:DigitalData.Core.Security.JwtSignatureHandler`1.#ctor(Microsoft.Extensions.Options.IOptions{DigitalData.Core.Security.Config.ClaimDescriptor{`0}},AutoMapper.IMapper)")]

View File

@@ -0,0 +1,14 @@
using DigitalData.Core.Abstractions.Security;
using DigitalData.Core.Security.Config;
using DigitalData.Core.Security.RSAKey;
using Microsoft.Extensions.Options;
namespace DigitalData.Core.Security
{
public static class Instance
{
private static readonly Lazy<RSAFactory<RSAFactoryParams>> LazyInstance = new(() => new(Options.Create<RSAFactoryParams>(new())));
public static IAsymmetricKeyFactory RSAFactory => LazyInstance.Value;
}
}

View File

@@ -0,0 +1,40 @@
using AutoMapper;
using DigitalData.Core.Abstractions.Security;
using DigitalData.Core.Security.Config;
using Microsoft.Extensions.Options;
using Microsoft.IdentityModel.Tokens;
using System.IdentityModel.Tokens.Jwt;
namespace DigitalData.Core.Security
{
public class JwtSignatureHandler<TPrincipal> : JwtSecurityTokenHandler, IJwtSignatureHandler<TPrincipal>
{
private readonly ClaimDescriptor<TPrincipal> _claimDescriptor;
private readonly IMapper _mapper;
private readonly ICryptoFactory _cryptoFactory;
public JwtSignatureHandler(IOptions<ClaimDescriptor<TPrincipal>> claimDescriptorOptions, IMapper mapper, ICryptoFactory cryptoFactory)
{
_claimDescriptor = claimDescriptorOptions.Value;
_mapper = mapper;
_cryptoFactory = cryptoFactory;
}
public SecurityToken CreateToken(TPrincipal subject, IAsymmetricTokenDescriptor descriptor)
{
var sDescriptor = _mapper.Map(descriptor);
sDescriptor.Claims = _claimDescriptor.CreateClaims?.Invoke(subject);
sDescriptor.Subject = _claimDescriptor.CreateSubject?.Invoke(subject);
return CreateToken(sDescriptor);
}
public SecurityToken CreateToken(TPrincipal subject, string issuer, string audience)
{
var descriptor = _cryptoFactory.TokenDescriptors.Get(issuer: issuer, audience: audience)
?? throw new InvalidOperationException($"No or multiple token description found for issuer '{issuer}' and audience '{audience}'.");
return CreateToken(subject: subject, descriptor: descriptor);
}
}
}

View File

@@ -0,0 +1,33 @@
using DigitalData.Core.Abstractions.Security;
using System.Reflection;
using System.Security.Cryptography;
namespace DigitalData.Core.Security.RSAKey
{
public class RSADecryptor : RSAPrivateKey, IAsymmetricDecryptor
{
public RSAEncryptionPadding Padding { get; init; } = RSAEncryptionPadding.OaepSHA256;
// TODO: add as json converter to IConfigurIConfiguration.Config
public string PaddingName
{
get => Padding.ToString();
init => Padding = typeof(RSAEncryptionPadding).GetProperty(value, BindingFlags.Public | BindingFlags.Static)?.GetValue(null) as RSAEncryptionPadding ?? throw new ArgumentException($"Padding '{value}' not found.");
}
public byte[] Decrypt(byte[] data) => RSA.Decrypt(data, Padding);
private readonly Lazy<IAsymmetricEncryptor> _lazyEncryptor;
public IAsymmetricEncryptor Encryptor => _lazyEncryptor.Value;
public RSADecryptor()
{
_lazyEncryptor = new(() => new RSAEncryptor()
{
Content = RSA.ExportRSAPublicKeyPem(),
Padding = Padding
});
}
}
}

View File

@@ -0,0 +1,20 @@
using DigitalData.Core.Abstractions.Security;
using System.Reflection;
using System.Security.Cryptography;
namespace DigitalData.Core.Security.RSAKey
{
public class RSAEncryptor : RSAPublicKey, IAsymmetricEncryptor
{
public RSAEncryptionPadding Padding { get; init; } = RSAEncryptionPadding.OaepSHA256;
// TODO: add as json converter to IConfigurIConfiguration.Config
public string PaddingName
{
get => Padding.ToString();
init => Padding = typeof(RSAEncryptionPadding).GetProperty(value, BindingFlags.Public | BindingFlags.Static)?.GetValue(null) as RSAEncryptionPadding ?? throw new ArgumentException($"Padding '{value}' not found.");
}
public byte[] Encrypt(byte[] data) => RSA.Encrypt(data, Padding);
}
}

View File

@@ -0,0 +1,66 @@
using DigitalData.Core.Abstractions.Security;
using DigitalData.Core.Security.Config;
using Microsoft.Extensions.Options;
using System.Security.Cryptography;
namespace DigitalData.Core.Security.RSAKey
{
public class RSAFactory<TRSAFactoryParams> : IAsymmetricKeyFactory where TRSAFactoryParams : RSAFactoryParams
{
protected readonly TRSAFactoryParams _params;
public RSAFactory(IOptions<TRSAFactoryParams> options)
{
options.Value.Init();
_params = options.Value;
}
public string CreatePrivateKeyPem(int? keySizeInBits = null, bool encrypt = false) => encrypt
? CreateEncryptedPrivateKeyPem(keySizeInBits: keySizeInBits)
: RSA.Create(keySizeInBits ?? _params.KeySizeInBits).ExportRSAPrivateKeyPem();
public string CreateEncryptedPrivateKeyPem(
PbeEncryptionAlgorithm? pbeEncryptionAlgorithm = null,
HashAlgorithmName? hashAlgorithmName = null,
int? iterationCount = null,
int? keySizeInBits = null,
string? password = null)
{
password ??= _params.PbePassword;
var pbeParameters = pbeEncryptionAlgorithm is null && hashAlgorithmName is null && iterationCount is null
? new PbeParameters(
pbeEncryptionAlgorithm ?? _params.PbeEncryptionAlgorithm,
hashAlgorithmName ?? _params.PbeHashAlgorithm,
iterationCount ?? _params.PbeIterationCount)
: _params.PbeParameters;
var encryptedPrivateKey = RSA.Create(keySizeInBits ?? _params.KeySizeInBits).ExportEncryptedPkcs8PrivateKey(password.AsSpan(), pbeParameters);
var pemChars = PemEncoding.Write(_params.EncryptedPrivateKeyPemLabel, encryptedPrivateKey);
return new string(pemChars);
}
public string CreateEncryptedPrivateKeyPem(
PbeParameters pbeParameters,
int? keySizeInBits = null,
string? password = null)
{
password ??= _params.PbePassword;
var encryptedPrivateKey = RSA.Create(keySizeInBits ?? _params.KeySizeInBits).ExportEncryptedPkcs8PrivateKey(password.AsSpan(), pbeParameters);
var pemChars = PemEncoding.Write(_params.EncryptedPrivateKeyPemLabel, encryptedPrivateKey);
return new string(pemChars);
}
public IAsymmetricDecryptor CreateDecryptor(string pem, string? issuer = null, string? audience = null, bool encrypt = false, RSAEncryptionPadding? padding = null) => new RSADecryptor()
{
Content = pem,
IsEncrypted = encrypt,
Padding = padding ?? RSAEncryptionPadding.OaepSHA256
};
}
}

View File

@@ -0,0 +1,16 @@
using DigitalData.Core.Abstractions.Security;
using System.Security.Cryptography;
namespace DigitalData.Core.Security.RSAKey
{
public class RSAKeyBase : IAsymmetricKey
{
#pragma warning disable CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable.
public virtual string Content { get; init; }
#pragma warning restore CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable.
public string? Id { get; init; }
protected virtual RSA RSA { get; } = RSA.Create();
}
}

View File

@@ -0,0 +1,55 @@
using DigitalData.Core.Abstractions.Security;
using System.Security.Cryptography;
namespace DigitalData.Core.Security.RSAKey
{
public class RSAPrivateKey : RSAKeyBase, IAsymmetricPrivateKey, IAsymmetricKey
{
private string? _pem;
public override string Content
{
#pragma warning disable CS8603 // Possible null reference return.
get => _pem;
#pragma warning restore CS8603 // Possible null reference return.
init
{
_pem = value;
Init();
}
}
public bool IsPemNull => _pem is null;
public bool IsEncrypted { get; init; }
protected TPublicKey CreatePublicKey<TPublicKey>() where TPublicKey : RSAPublicKey, new()
=> new() { Content = RSA.ExportRSAPublicKeyPem() };
private readonly Lazy<RSAPublicKey> _lazyPublicKey;
public IAsymmetricPublicKey PublicKey => _lazyPublicKey.Value;
public RSAPrivateKey()
{
_lazyPublicKey = new(CreatePublicKey<RSAPublicKey>);
}
internal void SetPem(string pem)
{
_pem = pem;
Init();
}
private void Init()
{
if (string.IsNullOrEmpty(_pem))
throw new InvalidOperationException ($"The content of RSA private key is null or empty. Id: {Id}.");
if (IsEncrypted)
RSA.ImportFromEncryptedPem(Content, Secrets.PBE_PASSWORD.AsSpan());
else
RSA.ImportFromPem(Content);
}
}
}

View File

@@ -0,0 +1,17 @@
using DigitalData.Core.Abstractions.Security;
namespace DigitalData.Core.Security.RSAKey
{
public class RSAPublicKey : RSAKeyBase, IAsymmetricPublicKey, IAsymmetricKey
{
public override string Content
{
get => base.Content;
init
{
base.Content = value;
RSA.ImportFromPem(value);
}
}
}
}

View File

@@ -0,0 +1,119 @@
using DigitalData.Core.Abstractions.Security;
using Microsoft.IdentityModel.Tokens;
namespace DigitalData.Core.Security.RSAKey
{
/// <summary>
/// Contains some information which used to create a security token. Designed to abstract <see cref="SecurityTokenDescriptor"/>
/// </summary>
public class RSATokenDescriptor : RSAPrivateKey, IAsymmetricTokenDescriptor
{
private readonly Lazy<RSATokenValidator> _lazyTokenValidator;
public IAsymmetricTokenValidator Validator => _lazyTokenValidator.Value;
public required TimeSpan Lifetime { get; init; }
#region SecurityTokenDescriptor Map
/// <summary>
/// Gets or sets the value of the 'audience' claim.
/// </summary>
public required string Audience { get; set; }
/// <summary>
/// Defines the compression algorithm that will be used to compress the JWT token payload.
/// </summary>
public string CompressionAlgorithm { get; set; }
/// <summary>
/// Gets or sets the <see cref="EncryptingCredentials"/> used to create a encrypted security token.
/// </summary>
public EncryptingCredentials EncryptingCredentials { get; set; }
/// <summary>
/// Gets or sets the value of the 'expiration' claim. This value should be in UTC.
/// The expiration time is the sum of DateTime.Now and LifeTime.
/// </summary>
public DateTime? Expires => DateTime.Now.AddTicks(Lifetime.Ticks);
/// <summary>
/// Gets or sets the issuer of this <see cref="SecurityTokenDescriptor"/>.
/// </summary>
public required string Issuer { get; set; }
/// <summary>
/// Gets or sets the time the security token was issued. This value should be in UTC.
/// </summary>
public DateTime? IssuedAt { get; set; }
/// <summary>
/// Gets or sets the notbefore time for the security token. This value should be in UTC.
/// </summary>
public DateTime? NotBefore { get; set; }
/// <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>
public string TokenType { get; set; }
/// <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>
public IDictionary<string, object> AdditionalHeaderClaims { get; set; }
/// <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>
public IDictionary<string, object> AdditionalInnerHeaderClaims { get; set; }
/// <summary>
/// Gets or sets the <see cref="SigningCredentials"/> used to create a security token.
/// </summary>
public SigningCredentials SigningCredentials => _lazySigningCredentials.Value;
#endregion SecurityTokenDescriptor
private readonly Lazy<RsaSecurityKey> _lazyRsaSecurityKey;
public SecurityKey SecurityKey => _lazyRsaSecurityKey.Value;
private readonly Lazy<SigningCredentials> _lazySigningCredentials;
/// <summary>
/// Specifies the signature algorithm to be applied to the <see cref="SigningCredentials"/>.
/// Default is <see cref="SecurityAlgorithms.RsaSha256"/>.
/// </summary>
public string SigningAlgorithm { get; init; } = SecurityAlgorithms.RsaSha256;
/// <summary>
/// Optionally specifies the digest algorithm to be applied during the signing process for the <see cref="SigningCredentials"/>.
/// If not provided, the default algorithm is used.
/// </summary>
public string? SigningDigest { get; init; }
#pragma warning disable CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable.
public RSATokenDescriptor()
#pragma warning restore CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable.
{
_lazyTokenValidator = new(CreatePublicKey<RSATokenValidator>);
_lazyRsaSecurityKey = new(() => new RsaSecurityKey(RSA));
_lazySigningCredentials = new(() => SigningDigest is null
? new(SecurityKey, SigningAlgorithm)
: new(SecurityKey, SigningAlgorithm, SigningDigest));
}
}
}

View File

@@ -0,0 +1,17 @@
using DigitalData.Core.Abstractions.Security;
using Microsoft.IdentityModel.Tokens;
namespace DigitalData.Core.Security.RSAKey
{
public class RSATokenValidator : RSAPublicKey, IAsymmetricTokenValidator
{
private readonly Lazy<RsaSecurityKey> _lazyRsaSecurityKey;
public SecurityKey SecurityKey => _lazyRsaSecurityKey.Value;
public RSATokenValidator()
{
_lazyRsaSecurityKey = new(() => new RsaSecurityKey(RSA));
}
}
}

View File

@@ -0,0 +1,14 @@
using System.Text.Json.Serialization;
namespace DigitalData.Core.Security
{
public static class Secrets
{
public static readonly DateTime CreationDate = new (2024, 11, 19);
public static readonly Version Version = new (1, 0);
[JsonIgnore]
internal static readonly string PBE_PASSWORD = "9mk@i/$QY&Mw@_--dI^ahlXpNKEtv_U-,V-46b19_-Z6-U_*89_n1_-5-r-_+_$_IY_mYQl-";
}
}

View File

@@ -2,7 +2,7 @@
using DigitalData.Core.Client;
using Microsoft.Extensions.DependencyInjection;
namespace DigitalData.Core.Tests
namespace DigitalData.Core.Tests.Client
{
[TestFixture]
public class BaseHttpClientServiceTests
@@ -14,22 +14,46 @@ namespace DigitalData.Core.Tests
public void SetUp()
{
_serviceProvider = new ServiceCollection()
.AddHttpClientService("https://jsonplaceholder.typicode.com/todos")
.AddHttpClientService("https://jsonplaceholder.typicode.com", "todos")
.BuildServiceProvider();
_service = _serviceProvider.GetRequiredService<IBaseHttpClientService>();
}
[Test]
public async Task FetchJsonAsync_ShouldReturnJsonResponse()
public async Task FetchJsonAsync_ShouldReturnJsonResponse_WithCorrectWithPath()
{
// Act
var expectedUserId = (int) await _service.FetchAsync("/1", sendWithCookie: false, saveCookie: false)
var expectedUserId = (int) await _service.FetchAsync(path: "/1", sendWithCookie: false, saveCookie: false)
.ThenAsync(res => res.Json())
.ThenAsync(todo => todo.userId);
// Assert
Assert.That(expectedUserId, Is.EqualTo(1), "The userId of the fetched JSON object should be 1.");
}
[Test]
public async Task FetchJsonAsync_ShouldReturnJsonResponse_WithQueryParams()
{
var queryParams = new Dictionary<string, object?>
{
{ "id", "1" }
};
// Act
var dyn_id = await _service.FetchAsync(queryParams: queryParams, sendWithCookie: false, saveCookie: false)
.ThenAsync(res => res.JsonList())
.ThenAsync(todo => todo.FirstOrDefault()?.userId);
try
{
Assert.That((int)dyn_id, Is.EqualTo(1), "The userId of the fetched JSON object should be 1.");
}
catch (InvalidCastException)
{
// Handle the case where the cast is not possible
Assert.Fail("The id could not be cast to an integer.");
}
}
}
}

View File

@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net7.0</TargetFramework>
<TargetFrameworks>net7.0;net8.0</TargetFrameworks>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
@@ -26,6 +26,7 @@
<ProjectReference Include="..\DigitalData.Core.Client\DigitalData.Core.Client.csproj" />
<ProjectReference Include="..\DigitalData.Core.DTO\DigitalData.Core.DTO.csproj" />
<ProjectReference Include="..\DigitalData.Core.Infrastructure\DigitalData.Core.Infrastructure.csproj" />
<ProjectReference Include="..\DigitalData.Core.Security\DigitalData.Core.Security.csproj" />
</ItemGroup>
</Project>

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