Windows (IIS)
Stellen Sie RAMP auf einem Windows Server mit IIS und Windows-integrierter Authentifizierung (Kerberos/NTLM) bereit. Dies ist ideal für Unternehmensumgebungen mit Active Directory, in denen sich Benutzer mit ihren Domänendaten authentifizieren.
Was die Bereitstellung umfasst
Abschnitt betitelt „Was die Bereitstellung umfasst“Das automatisierte Bereitstellungsskript (Deploy-RAMPToHyperV.ps1) übernimmt folgende Aufgaben:
- RAMP erstellen (Backend + Frontend)
- Verbindung zu einer Remote-VM über PowerShell Remoting herstellen
- IIS installieren und konfigurieren
- Anwendungsdateien bereitstellen
- Windows-integrierte Authentifizierung konfigurieren
- Datenbank einrichten (SQLite oder SQL Server)
- Bereitstellung mit Integritätsprüfungen validieren
Voraussetzungen
Abschnitt betitelt „Voraussetzungen“Auf Ihrem Entwicklungsrechner
Abschnitt betitelt „Auf Ihrem Entwicklungsrechner“- PowerShell 5.1+ oder PowerShell 7+
- RAMP-Quellcode mit allen Abhängigkeiten
- .NET 10 SDK zum Erstellen des Backends
- Node.js 18+ zum Erstellen des Frontends
- Netzwerkzugriff auf die Ziel-VM
Auf der Ziel-VM (Windows Server)
Abschnitt betitelt „Auf der Ziel-VM (Windows Server)“- Windows Server 2016+ (2019 oder 2022 empfohlen)
- Active Directory Domain Controller oder einer Domäne beigetretener Computer
- IIS (wird vom Skript installiert, falls nicht vorhanden)
- ASP.NET Core 10 Runtime (Hosting Bundle) — herunterladen von dotnet.microsoft.com
- PowerShell Remoting aktiviert:
Enable-PSRemoting -ForceFirewallregeln
Abschnitt betitelt „Firewallregeln“Stellen Sie sicher, dass diese Ports auf der Ziel-VM geöffnet sind:
| Port | Protokoll | Zweck |
|---|---|---|
| 5985 | HTTP | PowerShell Remoting (WinRM) |
| 5986 | HTTPS | PowerShell Remoting über SSL (optional) |
| 80 | HTTP | RAMP-Webanwendung |
| 443 | HTTPS | RAMP-Webanwendung (bei SSL) |
Schnellstart
Abschnitt betitelt „Schnellstart“-
Navigieren Sie zum RAMP-Quellverzeichnis:
Terminal-Fenster cd C:\Source\RAMP -
Führen Sie das Bereitstellungsskript mit Standardeinstellungen aus:
Terminal-Fenster .\Deploy-RAMPToHyperV.ps1 -
Öffnen Sie RAMP unter
http://<vm-ip-adresse>. Sie werden zur Eingabe von Windows-Anmeldedaten aufgefordert.
Standardeinstellungen:
| Einstellung | Standardwert |
|---|---|
| Websitename | RAMP |
| App Pool | RAMP_AppPool |
| Port | 80 |
| Datenbank | SQLite |
| Bereitstellungspfad | C:\inetpub\RAMP |
Bereitstellungsoptionen
Abschnitt betitelt „Bereitstellungsoptionen“# Auf Standard-VM bereitstellen.\Deploy-RAMPToHyperV.ps1# Anmeldedaten abfragen$cred = Get-Credential
# Auf benutzerdefinierte VM bereitstellen.\Deploy-RAMPToHyperV.ps1 -VMHost 192.168.1.100 -Credential $cred# Vorhandene RAMP-Bereitstellung überschreiben.\Deploy-RAMPToHyperV.ps1 -Force# Build-Schritt überspringen (schneller für erneute Bereitstellung).\Deploy-RAMPToHyperV.ps1 -SkipBuild# Auf benutzerdefiniertem Port und Websitenamen bereitstellen.\Deploy-RAMPToHyperV.ps1 -Port 8080 -SiteName "RAMP_Production" -AppPoolName "RAMP_Prod_Pool"# SQL Server verwenden (Verbindungszeichenfolge nach der Bereitstellung manuell konfigurieren).\Deploy-RAMPToHyperV.ps1 -DatabaseType SQLServerVerzeichnisstruktur
Abschnitt betitelt „Verzeichnisstruktur“Nach der Bereitstellung stellt IIS aus der folgenden Struktur bereit:
C:\inetpub\RAMP\├── wwwroot\ # Frontend-Build-Ausgabe│ ├── index.html│ └── assets\├── appsettings.json├── appsettings.Production.json # Vom Skript generiert├── RAMP.API.dll├── RAMP.API.exe├── web.config # Vom Skript generiert├── logs\│ └── stdout_*.log # IIS stdout-Protokolle└── data\ └── ramp.db # SQLite-DatenbankKonfiguration
Abschnitt betitelt „Konfiguration“appsettings.Production.json
Abschnitt betitelt „appsettings.Production.json“Das Bereitstellungsskript generiert diese Datei. Wichtige Abschnitte:
{ "ConnectionStrings": { "DefaultConnection": "Data Source=C:\\inetpub\\RAMP\\data\\ramp.db" }, "Authentication": { "WindowsAuthentication": { "Enabled": true, "AutomaticChallenge": true }, "Jwt": { "Issuer": "http://your-server", "Audience": "http://your-server", "SecretKey": "CHANGE_THIS_IN_PRODUCTION_MIN_32_CHARS" } }, "CORS": { "AllowedOrigins": ["http://your-server"] }}Die vollständige Konfigurationsreferenz finden Sie unter Anwendungseinstellungen.
web.config
Abschnitt betitelt „web.config“Das Bereitstellungsskript generiert web.config mit dem ASP.NET Core-Modul und Windows-Authentifizierung:
<?xml version="1.0" encoding="utf-8"?><configuration> <location path="." inheritInChildApplications="false"> <system.webServer> <handlers> <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" /> </handlers> <aspNetCore processPath="dotnet" arguments=".\RAMP.API.dll" stdoutLogEnabled="true" stdoutLogFile=".\logs\stdout" hostingModel="inprocess" /> <security> <authentication> <windowsAuthentication enabled="true"> <providers> <add value="Negotiate" /> <add value="NTLM" /> </providers> </windowsAuthentication> <anonymousAuthentication enabled="false" /> </authentication> </security> </system.webServer> </location></configuration>IIS-Einstellungen
Abschnitt betitelt „IIS-Einstellungen“| Einstellung | Wert |
|---|---|
| Anwendungspool | RAMP_AppPool |
| .NET CLR-Version | Kein verwalteter Code (verwendet .NET 10 Runtime) |
| Verwalteter Pipeline-Modus | Integriert |
| 32-Bit-Anwendungen aktivieren | False |
| Identität | ApplicationPoolIdentity |
| Windows-Authentifizierung | Aktiviert (Negotiate, NTLM) |
| Anonyme Authentifizierung | Deaktiviert |
Authentifizierungsablauf
Abschnitt betitelt „Authentifizierungsablauf“Funktionsweise der Windows-integrierten Authentifizierung
Abschnitt betitelt „Funktionsweise der Windows-integrierten Authentifizierung“-
Der Benutzer navigiert zur Anwendung unter
http://your-server. -
IIS fordert den Browser auf mit HTTP 401 und dem Header
WWW-Authenticate: Negotiate. -
Der Browser sendet Windows-Anmeldedaten über Kerberos (bevorzugt) oder NTLM als Fallback.
-
IIS validiert die Anmeldedaten gegen Active Directory und setzt
HttpContext.User.Identityauf dieWindowsIdentity. -
Der Benutzer meldet sich bei RAMP an — das Frontend ruft
POST /_api/auth/windows-loginauf. Das Backend extrahiert dieWindowsIdentityund ordnetDOMÄNE\Benutzernameeinem RAMP-Benutzer zu. -
RAMP stellt JWT-Token aus — ein Zugriffstoken (8 Stunden Ablaufzeit) und ein Aktualisierungstoken.
-
Das Frontend speichert Token im localStorage und sendet
Authorization: Bearer <token>bei nachfolgenden Anfragen.
Zuordnung von Windows-Benutzer zu RAMP-Benutzer
Abschnitt betitelt „Zuordnung von Windows-Benutzer zu RAMP-Benutzer“Der Benutzername wird aus dem Format DOMÄNE\Benutzername extrahiert:
| Windows-Identität | Extrahierter Benutzername | RAMP-Benutzer |
|---|---|---|
CORP\john.doe | john.doe | john.doe |
DOMAIN\jsmith | jsmith | jsmith |
RAMP-Benutzer für Windows-Authentifizierung erstellen
Abschnitt betitelt „RAMP-Benutzer für Windows-Authentifizierung erstellen“- Als Administrator anmelden
- Zur Seite Benutzer navigieren
- Einen Benutzer mit einem Benutzernamen erstellen, der dem Windows-Benutzernamen entspricht (z.B.
john.doe) - Entsprechende Rollen zuweisen
Benutzer zur Scaffold-Datei (default.yaml) hinzufügen:
users: - username: john.doe email: john.doe@corp.local firstName: John lastName: Doe isActive: true appRoles: - UserFehlerbehebung
Abschnitt betitelt „Fehlerbehebung“PowerShell Remoting funktioniert nicht
Abschnitt betitelt „PowerShell Remoting funktioniert nicht“Fehler: Failed to connect to <ip-address>
Lösung — führen Sie diese Befehle als Administrator auf der VM aus:
Enable-PSRemoting -ForceSet-Item WSMan:\localhost\Client\TrustedHosts -Value "<ip-address>" -ForceRestart-Service WinRM.NET Runtime nicht gefunden
Abschnitt betitelt „.NET Runtime nicht gefunden“Fehler: .NET 10 Runtime required
- Laden Sie das ASP.NET Core 10 Hosting Bundle von dotnet.microsoft.com herunter.
- Installieren Sie es auf der VM.
- Starten Sie IIS neu:
iisreset
HTTP 500.19 — Ungültige Konfiguration
Abschnitt betitelt „HTTP 500.19 — Ungültige Konfiguration“Ursache: web.config ist ungültig oder das ASP.NET Core-Modul ist nicht installiert.
Lösung: Installieren Sie das ASP.NET Core Hosting Bundle und starten Sie IIS mit iisreset neu.
HTTP 401 — Nicht autorisiert (Anmeldedaten-Schleife)
Abschnitt betitelt „HTTP 401 — Nicht autorisiert (Anmeldedaten-Schleife)“Ursache: Windows-Authentifizierung ist nicht korrekt konfiguriert.
IIS-Authentifizierungseinstellungen überprüfen:
# Sollte True zurückgebenGet-WebConfigurationProperty ` -Filter "/system.webServer/security/authentication/windowsAuthentication" ` -Name "enabled" -PSPath "IIS:\Sites\RAMP"
# Sollte Negotiate und NTLM enthaltenGet-WebConfiguration ` -Filter "/system.webServer/security/authentication/windowsAuthentication/providers" ` -PSPath "IIS:\Sites\RAMP"Benutzer nicht in RAMP gefunden
Abschnitt betitelt „Benutzer nicht in RAMP gefunden“Symptom: Windows-Anmeldung erfolgreich, aber RAMP gibt 401 mit “User not found” zurück.
Lösung: Erstellen Sie den Benutzer in RAMP mit einem Benutzernamen, der dem Windows-Benutzernamen entspricht (siehe Benutzer erstellen oben).
Datenbankberechtigungsfehler
Abschnitt betitelt „Datenbankberechtigungsfehler“Ursache: Die IIS-Anwendungspoolidentität kann nicht in das Datenbankverzeichnis schreiben.
icacls "C:\inetpub\RAMP\data" /grant IIS_IUSRS:(OI)(CI)FProtokolle anzeigen
Abschnitt betitelt „Protokolle anzeigen“Get-Content "C:\inetpub\RAMP\logs\stdout_*.log" -Tail 50Get-Content "C:\inetpub\RAMP\logs\ramp-*.log" -Tail 50Get-EventLog -LogName Application -Source "IIS AspNetCore Module V2" -Newest 10Produktionsüberlegungen
Abschnitt betitelt „Produktionsüberlegungen“Sicherheitshärtung
Abschnitt betitelt „Sicherheitshärtung“-
HTTPS verwenden — installieren Sie ein SSL-Zertifikat in IIS, binden Sie es an Port 443 und erzwingen Sie eine HTTPS-Weiterleitung.
-
JWT-Secret ändern — aktualisieren Sie
Jwt:SecretKeyinappsettings.Production.jsonmit einem starken, zufällig generierten Schlüssel (mindestens 32 Zeichen). -
CORS-Ursprünge einschränken — aktualisieren Sie
CORS:AllowedOrigins, sodass nur Ihre Produktionsdomänen enthalten sind. Entfernen Siehttp://localhost:5173. -
SQL Server für die Produktion verwenden — SQLite ist nur für Demos geeignet. Konfigurieren Sie eine SQL Server-Verbindungszeichenfolge und führen Sie Datenbankmigrationen durch.
-
Kerberos-SPNs konfigurieren — registrieren Sie für die Kerberos-Authentifizierung Service Principal Names:
Terminal-Fenster setspn -S HTTP/ramp.example.com DOMAIN\ServiceAccountsetspn -S HTTP/ramp DOMAIN\ServiceAccount -
Dediziertes Dienstkonto verwenden — erstellen Sie ein dediziertes AD-Dienstkonto für den IIS App Pool mit minimal erforderlichen Berechtigungen.
Leistungsoptimierung
Abschnitt betitelt „Leistungsoptimierung“# Leerlaufzeitlimit auf 0 setzen (immer aktiv)Set-ItemProperty "IIS:\AppPools\RAMP_AppPool" ` -Name processModel.idleTimeout -Value ([TimeSpan]::FromMinutes(0))
# Periodisches Recycling deaktivierenSet-ItemProperty "IIS:\AppPools\RAMP_AppPool" ` -Name recycling.periodicRestart.time -Value ([TimeSpan]::FromMinutes(0))Aktivieren Sie außerdem die IIS-Antwortkomprimierung (sowohl statisch als auch dynamisch) für bessere Leistung.
Integritätsprüfungen
Abschnitt betitelt „Integritätsprüfungen“| Endpunkt | Zweck |
|---|---|
/_health | Umfassende Integritätsprüfung (Datenbank, Hangfire) |
/_health/ready | Bereitschaftsprüfung für Load Balancer |
/_health/live | Liveness-Prüfung |
Sicherung und Wiederherstellung
Abschnitt betitelt „Sicherung und Wiederherstellung“# Datenbankdatei kopierenCopy-Item "C:\inetpub\RAMP\data\ramp.db" ` "C:\Backups\ramp_$(Get-Date -Format 'yyyyMMdd_HHmmss').db"# Gesamten Anwendungsordner sichernCompress-Archive -Path "C:\inetpub\RAMP" ` -DestinationPath "C:\Backups\RAMP_Backup_$(Get-Date -Format 'yyyyMMdd').zip"Hochverfügbarkeit
Abschnitt betitelt „Hochverfügbarkeit“Für Hochverfügbarkeit mit IIS:
- Auf mehreren IIS-Servern hinter einem Load Balancer bereitstellen (IIS ARR, Azure Load Balancer, F5 usw.)
- SQL Server mit AlwaysOn Availability Groups für gemeinsame Datenbank verwenden
- Verteilten Cache (Redis) für gemeinsamen Sitzungsstatus und Refresh-Token-Speicherung konfigurieren