Work in Progress
Diese Seite ist aktuell im Review! Die Seite wurde noch nicht qualitätsgesichert und kann Fehler enthalten.
Die verlinkten Seiten sind ggf. nur für Schleupen-Mitarbeiter sichtbar.

API-Gateway einrichten

Im folgenden wird beschrieben wie das API-Gateway Schleupen.CS.PI.SB.GTW_Gateway eingerichtet wird. Die folgenden Schritte zur Einrichtung sind sorgfältig durchzuführen.

Hosting

Das API-Gateway wird als Executable oder Docker-Container ausgeliefert. Wird dieses als Executable genutzt, so bietet es sich an, dieses als Windows-Dienst zu betreiben.

Per Powershell kann dieser beispielsweise wie folgt eingerichtet werden:

New-Service -Name "APIGatewayService" `
            -DisplayName "Schleupen API Gateway" `
            -BinaryPathName "C:\Pfad\zu\Schleupen.CS.PI.SB.Gateway.Services.exe" `
            -StartupType Automatic
Start-Service "APIGatewayService"

Serviceimplementierungsgruppe (SIG) zuordnen

Für das Element-Mapping wird die die folgende Serviceimplementierungsgruppe benötigt. Diese ist per Standard eingerichtet.

Systemintegration (Schleupen.CS.gpi.sig.Systemkatalog_1.0)

Diese kann bzw. ist in der Regel auf Systemebene registriert.

Einrichtung des Systemstrukturelement-Mappings

Mithilfe des Mappings von Systemstrukturelementen wird der Zugriff auf ein Schleupen.CS-System vereinfacht. Dabei kann pro Systemstruktur-Element anstelle eines SessionTokens einfacher ein konfigurierter, sprechender Name (z.B. Mandantennamen) verwendet werden.

Das folgende Skript zeigt, wie dieses Mapping für einen Knoten konfiguriert wird.

$elementName = "MANDANTENBEZEICHNUNG"
$identification = "Schleupen.CS.PI.SB.Gateway.Mapping"
$externalIdentifier = "MANDANTENBEZEICHNUNG"

$ErrorActionPreference = "Stop"
$elementId = (Select-SystemStructureElement -Name $elementName).Id
$systemUsageId = (Select-SystemUsage -Name "Produktiv").Id

$externalMappings = Select-ExternalElementMappings
$newMapping = New-ExternalElementMapping -Identification $identification -ElementId $elementId -SystemUsageId $systemUsageId -ExternalIdentifier $externalIdentifier
Add-ExternalElementMapping -externalMapping $externalMappings -Mapping $newMapping
Save-ExternalElementMappings -XmlDoc $externalMappings

Aus Gründen der Übersichtlichkeit wird empfohlen, bei $elementName und $externalIdentifier denselben Wert (Mandantenbezeichnung, z.B. LieferantMoersHuelsdonk1) einzutragen. $identification darf nicht geändert werden.

Anbindung des Schleupen.CS-Systems

Mithilfe der Konfiguration von YARP wird der Host konfiguriert, gegen den das Gateway das Scheupen.CS-System initial kontaktiert. Hier ermittelt sich das Gateway alle CS-Hosts, die dann für das Load Balancing verwendet werden.

{
	...
	"ReverseProxy": {
		"Routes": {
			"route1": {
				"ClusterId": "cluster1",
				"Match": {
					"Path": "/schleupen/{**catch-all}"
				}
			}
		},
		"Clusters": {
			"cluster1": {				
				"HttpRequest": {
					"Version": "1.1",
					"VersionPolicy": "RequestVersionExact"
				},
				"Destinations": {
					"destination1": {
						"Address": "https://<CS-Hook-Host>:443" // destination entry point of Schleupen.CS, then one of the clustered hosts will be used
					}
				}
			}
		}
	}
}

YARP bietet Strategien für das Load-Balancing, diese können statisch über die appsettings.json definiert werden. Gewünscht ist allerdings ein dynamischers Verhalten und kein manuelles Verfahren, daher werden die CS-Hosts ausgelesen. Diese CS-Hosts werden intern verwendet, wobei derzeit die Strategie 'Random' verwendet wird.

Authentifizierung und Autorisierung

Da das Gateway auf ASP.NET Core MVC und YARP basiert, siehe hierzu unbedingt https://learn.microsoft.com/en-us/aspnet/core/fundamentals/servers/yarp/authn-authz!

Über die Konfigurationsparameter 'CSOptions.AuthenticationOptions.AuthenticationMode' und 'CSOptions.AuthenticationOptions.DestinationAuthenticationMode' kann festgelegt werden, welche Absicherung für die Strecke von Client zu API-Gateway und/oder für die Strecke von API-Gateway zu Schleupen.CS-System verwendet wird.

Folgende Modi werden angeboten:

  • ActiveDirectory
    Anmerkung: Windows Authentifizierung wird nicht durchgeroutet, d.h. der Aufrufer wird am API-Gateway authentifiziert (per Negotiation) und der Benutzer, der das Gateway ausführt, wird an Schleupen.CS authentifiziert.
    Details siehe https://github.com/dotnet/yarp/issues/166
  • [in Planung] Open ID Connect
    Hiebei wird BearerToken als JWT wird durchgereicht und Eingangsseitig das Token validiert. Ein separates Token wird für den Zugriff auf Schleupen.CS verwendet.
  • Passthru
    In diesem Modus werden die Authentifizierungs-/Autorisierungsinformationen weitergeleitet. Dies ist in der Regel ein BearerToken als JWT.
    Wichtig: Dies ist dafür gedacht, um in einigen Szenarien das BearerToken zum Schleupen.CS-System durchzureichen.

In appsettings.json kann dies wie folgt konfiguriert werden:

{
	...
	"CSOptions": {
		...
		"AuthenticationOptions": {
			"AuthenticationMode": "Passthru", // ActiveDirectory
			"DestinationAuthenticationMode": "ActiveDirectory" // Passthru
		}
	},
	...
}

Transport Layer Security

Um HTTPS zur Transportsicherheit zu aktivieren, können die Standard-Konfigurationen verwendet werden.

{
	"Kestrel": {
		"Endpoints": {
			"HttpsFromPfx": {
				"Url": "https://0.0.0.0:55044",
				"Certificate": {
					"Path": "D:\\temp\\https_test\\localhost.pfx",
					"Password": "Passw0rd!"
				}
			}
			"HttpsFromStore": {
				"Url": "https://0.0.0.0:443",
				"Certificate": {
					"Subject": "CN=localhost",
					"Store": "My",
					"Location": "CurrentUser",
					"AllowInvalid": false
				}
			}
		}
	},
	...
}

Logging

Es kann ein auf NLog basierendes Logging oder auch die Diagnoseprotokollierung von Schleupen.CS auf CS-Hosts verwendet werden. Dies über den Konfigurationsschalter 'CSOptions.LoggingMode' festgelegt werden. Eine Default-Konfiguration für NLog wird mitgeliefert.

{
	...
	"CSOptions": {
		"LoggingMode": "NLog", // CSLogging
		...
	},
	"Logging": {
		"LogLevel": {
			"Default": "Information",
			"Microsoft": "Warning",
			"Yarp": "Information",
			"Microsoft.Hosting.Lifetime": "Information"
		}
	},
	...
}

Routen- und Host-Filterung

Über ASP.NET Core können die Host angegeben werden, die das Gateway aufrufen dürfen. Siehe hierzu https://learn.microsoft.com/de-de/aspnet/core/fundamentals/servers/kestrel/host-filtering. ''ReverseProxy.Routes.<myroute>.Match.Path' gibt an, unter welchem URL-Pfad YARP Anfragen entgegennimmt.

{
	...
	"AllowedHosts": "auth.meinefirma.de",
	"ReverseProxy": {
		"Routes": {
			"route1": {
				"ClusterId": "cluster1",
				"Match": {
					"Path": "/schleupen/{**catch-all}"
				}
			}
		},
		...
	}
}

Beispiel

Die Einstellungen können und sollten teilweise per Umgebungsvariablen oder Programmargumenten gelöst werden. Siehe hierzu: https://learn.microsoft.com/en-us/aspnet/core/fundamentals/configuration

{
	"Kestrel": {
		"Endpoints": {
			"HttpsFromPfx": {
				"Url": "https://0.0.0.0:55044",
				"Certificate": {
					"Path": "D:\\temp\\https_test\\localhost.pfx",
					"Password": "Passw0rd!"
				}
			}
		}
	},
	"CSOptions": {
		"LoggingMode": "NLog", // CSLogging
		"AuthenticationOptions": {
			"AuthenticationMode": "Passthru", // ActiveDirectory
			"DestinationAuthenticationMode": "ActiveDirectory" // Passthru
		}
	},
	"Logging": {
		"LogLevel": {
			"Default": "Information",
			"Microsoft": "Warning",
			"Yarp": "Information",
			"Microsoft.Hosting.Lifetime": "Information"
		}
	},
	"AllowedHosts": "auth.meinefirma.de",
	"ReverseProxy": {
		"Routes": {
			"route1": {
				"ClusterId": "cluster1",
				"Match": {
					"Path": "/schleupen/{**catch-all}"
				}
			}
		},
		"Clusters": {
			"cluster1": {
				"LoadBalancingPolicy": "Random",
				//"HttpClient": {
				//	"WebProxy": { // Optional proxy configuration for outgoing requests
				//		"Address": "http://ProxyInFrontOfDestination",
				//		"BypassOnLocal": false,
				//		"UseDefaultCredentials": true
				//	}
				//},
				"HttpRequest": {
					"Version": "1.1",
					"VersionPolicy": "RequestVersionExact"
				},
				"Destinations": {
					"destination1": {
						"Address": "https://<CS-Hook-Host>:443" // destination entry point of Schleupen.CS, then one of the clustered host will be used
					}
				}
			}
		}
	}
}
Chatbot not allowed
Cookie Consent mit Real Cookie Banner