Zum Inhalt springen

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.

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
  • 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
  • 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:
Terminal-Fenster
Enable-PSRemoting -Force

Stellen Sie sicher, dass diese Ports auf der Ziel-VM geöffnet sind:

PortProtokollZweck
5985HTTPPowerShell Remoting (WinRM)
5986HTTPSPowerShell Remoting über SSL (optional)
80HTTPRAMP-Webanwendung
443HTTPSRAMP-Webanwendung (bei SSL)

  1. Navigieren Sie zum RAMP-Quellverzeichnis:

    Terminal-Fenster
    cd C:\Source\RAMP
  2. Führen Sie das Bereitstellungsskript mit Standardeinstellungen aus:

    Terminal-Fenster
    .\Deploy-RAMPToHyperV.ps1
  3. Öffnen Sie RAMP unter http://<vm-ip-adresse>. Sie werden zur Eingabe von Windows-Anmeldedaten aufgefordert.

Standardeinstellungen:

EinstellungStandardwert
WebsitenameRAMP
App PoolRAMP_AppPool
Port80
DatenbankSQLite
BereitstellungspfadC:\inetpub\RAMP

Terminal-Fenster
# Auf Standard-VM bereitstellen
.\Deploy-RAMPToHyperV.ps1

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-Datenbank

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.

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>
EinstellungWert
AnwendungspoolRAMP_AppPool
.NET CLR-VersionKein verwalteter Code (verwendet .NET 10 Runtime)
Verwalteter Pipeline-ModusIntegriert
32-Bit-Anwendungen aktivierenFalse
IdentitätApplicationPoolIdentity
Windows-AuthentifizierungAktiviert (Negotiate, NTLM)
Anonyme AuthentifizierungDeaktiviert

Funktionsweise der Windows-integrierten Authentifizierung

Abschnitt betitelt „Funktionsweise der Windows-integrierten Authentifizierung“
  1. Der Benutzer navigiert zur Anwendung unter http://your-server.

  2. IIS fordert den Browser auf mit HTTP 401 und dem Header WWW-Authenticate: Negotiate.

  3. Der Browser sendet Windows-Anmeldedaten über Kerberos (bevorzugt) oder NTLM als Fallback.

  4. IIS validiert die Anmeldedaten gegen Active Directory und setzt HttpContext.User.Identity auf die WindowsIdentity.

  5. Der Benutzer meldet sich bei RAMP an — das Frontend ruft POST /_api/auth/windows-login auf. Das Backend extrahiert die WindowsIdentity und ordnet DOMÄNE\Benutzername einem RAMP-Benutzer zu.

  6. RAMP stellt JWT-Token aus — ein Zugriffstoken (8 Stunden Ablaufzeit) und ein Aktualisierungstoken.

  7. Das Frontend speichert Token im localStorage und sendet Authorization: Bearer <token> bei nachfolgenden Anfragen.

Der Benutzername wird aus dem Format DOMÄNE\Benutzername extrahiert:

Windows-IdentitätExtrahierter BenutzernameRAMP-Benutzer
CORP\john.doejohn.doejohn.doe
DOMAIN\jsmithjsmithjsmith

RAMP-Benutzer für Windows-Authentifizierung erstellen

Abschnitt betitelt „RAMP-Benutzer für Windows-Authentifizierung erstellen“
  1. Als Administrator anmelden
  2. Zur Seite Benutzer navigieren
  3. Einen Benutzer mit einem Benutzernamen erstellen, der dem Windows-Benutzernamen entspricht (z.B. john.doe)
  4. Entsprechende Rollen zuweisen

Fehler: Failed to connect to <ip-address>

Lösung — führen Sie diese Befehle als Administrator auf der VM aus:

Terminal-Fenster
Enable-PSRemoting -Force
Set-Item WSMan:\localhost\Client\TrustedHosts -Value "<ip-address>" -Force
Restart-Service WinRM

Fehler: .NET 10 Runtime required

  1. Laden Sie das ASP.NET Core 10 Hosting Bundle von dotnet.microsoft.com herunter.
  2. Installieren Sie es auf der VM.
  3. Starten Sie IIS neu: iisreset

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:

Terminal-Fenster
# Sollte True zurückgeben
Get-WebConfigurationProperty `
-Filter "/system.webServer/security/authentication/windowsAuthentication" `
-Name "enabled" -PSPath "IIS:\Sites\RAMP"
# Sollte Negotiate und NTLM enthalten
Get-WebConfiguration `
-Filter "/system.webServer/security/authentication/windowsAuthentication/providers" `
-PSPath "IIS:\Sites\RAMP"

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).

Ursache: Die IIS-Anwendungspoolidentität kann nicht in das Datenbankverzeichnis schreiben.

Terminal-Fenster
icacls "C:\inetpub\RAMP\data" /grant IIS_IUSRS:(OI)(CI)F
Terminal-Fenster
Get-Content "C:\inetpub\RAMP\logs\stdout_*.log" -Tail 50

  1. HTTPS verwenden — installieren Sie ein SSL-Zertifikat in IIS, binden Sie es an Port 443 und erzwingen Sie eine HTTPS-Weiterleitung.

  2. JWT-Secret ändern — aktualisieren Sie Jwt:SecretKey in appsettings.Production.json mit einem starken, zufällig generierten Schlüssel (mindestens 32 Zeichen).

  3. CORS-Ursprünge einschränken — aktualisieren Sie CORS:AllowedOrigins, sodass nur Ihre Produktionsdomänen enthalten sind. Entfernen Sie http://localhost:5173.

  4. 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.

  5. Kerberos-SPNs konfigurieren — registrieren Sie für die Kerberos-Authentifizierung Service Principal Names:

    Terminal-Fenster
    setspn -S HTTP/ramp.example.com DOMAIN\ServiceAccount
    setspn -S HTTP/ramp DOMAIN\ServiceAccount
  6. Dediziertes Dienstkonto verwenden — erstellen Sie ein dediziertes AD-Dienstkonto für den IIS App Pool mit minimal erforderlichen Berechtigungen.

Terminal-Fenster
# Leerlaufzeitlimit auf 0 setzen (immer aktiv)
Set-ItemProperty "IIS:\AppPools\RAMP_AppPool" `
-Name processModel.idleTimeout -Value ([TimeSpan]::FromMinutes(0))
# Periodisches Recycling deaktivieren
Set-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.

EndpunktZweck
/_healthUmfassende Integritätsprüfung (Datenbank, Hangfire)
/_health/readyBereitschaftsprüfung für Load Balancer
/_health/liveLiveness-Prüfung
Terminal-Fenster
# Datenbankdatei kopieren
Copy-Item "C:\inetpub\RAMP\data\ramp.db" `
"C:\Backups\ramp_$(Get-Date -Format 'yyyyMMdd_HHmmss').db"

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