Freigeben über


Schützen von serverseitigen Blazor-Apps als ASP.NET Core-Anwendungen

Hinweis

Dies ist nicht die neueste Version dieses Artikels. Die aktuelle Version finden Sie in der .NET 9-Version dieses Artikels.

Warnung

Diese Version von ASP.NET Core wird nicht mehr unterstützt. Weitere Informationen finden Sie in der Supportrichtlinie für .NET und .NET Core. Informationen zum aktuellen Release finden Sie in der .NET 8-Version dieses Artikels.

Wichtig

Diese Informationen beziehen sich auf ein Vorabversionsprodukt, das vor der kommerziellen Freigabe möglicherweise noch wesentlichen Änderungen unterliegt. Microsoft gibt keine Garantie, weder ausdrücklich noch impliziert, hinsichtlich der hier bereitgestellten Informationen.

Die aktuelle Version finden Sie in der .NET 9-Version dieses Artikels.

In diesem Artikel wird erläutert, wie Sie serverseitige Blazor-Apps als ASP.NET Core-Anwendungen schützen.

Das Schützen von serverseitigen Blazor-Apps funktioniert genau wie bei ASP.NET Core-Apps. Weitere Informationen finden Sie in den Artikeln unter Sicherheitsaspekte für ASP.NET Core.

Der Authentifizierungskontext wird nur beim Starten der App eingerichtet, d. h. wenn die App zum ersten Mal eine Verbindung mit dem WebSocket herstellt. Der Authentifizierungskontext wird für die Lebensdauer der Verbindung beibehalten. Apps überprüfen den Authentifizierungsstatus der Benutzenden regelmäßig alle 30 Minuten.

Wenn die App Benutzer für benutzerdefinierte Dienste erfassen oder auf Updates des Benutzers reagieren muss, lesen Sie Zusätzliche Sicherheitsszenarios für ASP.NET Core Blazor (serverseitig).

Blazor unterscheidet sich von herkömmlichen, servergerenderten Webanwendungen, die bei jeder Seitennavigation neue HTTP-Anfragen mit Cookies stellen. Die Authentifizierung wird bei Navigationsereignissen überprüft. Cookies sind jedoch nicht beteiligt. Cookies werden nur gesendet, wenn eine HTTP-Anforderung an einen Server erfolgt, was nicht der Fall ist, wenn die Person in einer Blazor-App navigiert. Während der Navigation wird der Authentifizierungsstatus des Benutzers innerhalb des Blazor Schaltkreises überprüft, den Sie jederzeit auf dem Server mithilfe einer erneuten AuthenticationStateProviderÜberprüfung von ](#additional-authentication-state-providers) aktualisieren können.

Wichtig

Das Implementieren eines benutzerdefinierten NavigationManager zum Erzielen der Authentifizierungsvalidierung während der Navigation wird nicht empfohlen. Wenn die App während der Navigation benutzerdefinierte Authentifizierungsstatuslogik ausführen muss, verwenden Sie einen benutzerdefinierten AuthenticationStateProvider.

Hinweis

Die Codebeispiele in diesem Artikel verwenden Nullwerte zulassende Verweistypen (Nullable Reference Types, NRTs) und die statische Analyse des NULL-Zustands des .NET-Compilers, die in ASP.NET Core in .NET 6 oder höher unterstützt werden. Entfernen Sie bei ASP.NET Core 5.0 oder früher die NULL-Typbezeichnung (?) aus den Beispielen in diesem Artikel.

Serverseitige Sicherheit vertraulicher Daten und Anmeldeinformationen

In Test-/Staging- und Produktionsumgebungen sollten serverseitiger Blazor Code und Web-APIs sichere Authentifizierungsflüsse verwenden, die die Authentifizierung von Anmeldeinformationen innerhalb von Projektcode- oder Konfigurationsdateien vermeiden. Außerhalb der lokalen Entwicklungstests wird empfohlen, die Verwendung von Umgebungsvariablen zum Speichern vertraulicher Daten zu vermeiden, da Umgebungsvariablen nicht der sicherste Ansatz sind. Für lokale Entwicklungstests wird das Tool "Geheimer Manager" zum Sichern vertraulicher Daten empfohlen. Weitere Informationen finden Sie in den folgenden Ressourcen:

Verwenden Sie für clientseitige und serverseitige lokale Entwicklung und Tests das Tool "Geheimer Manager", um vertrauliche Anmeldeinformationen zu sichern.

Projektvorlage

Erstellen Sie eine neue serverseitige Blazor-App, indem Sie die Anleitung unter Tools für ASP.NET Core Blazor befolgen.

Nachdem Sie die Vorlage für serverseitige Apps ausgewählt und das Projekt konfiguriert haben, wählen Sie unter Authentifizierungstyp die Authentifizierung der App aus:

  • Keine (Standardwert): Keine Authentifizierung.
  • Einzelne Konten: Benutzerkonten werden mithilfe von ASP.NET Core Identity in der App gespeichert.
  • Keine (Standardwert): Keine Authentifizierung.
  • Einzelne Konten: Benutzerkonten werden mithilfe von ASP.NET Core Identity in der App gespeichert.
  • Microsoft identity-Plattform: Weitere Informationen finden Sie unter ASP.NET Core Blazor-Authentifizierung und -Autorisierung.
  • Windows: Verwenden Sie die Windows-Authentifizierung.

BlazorIdentity-Benutzeroberfläche (einzelne Konten)

Blazor unterstützt das Generieren einer vollständigen Blazor-basierten Identity-Benutzeroberfläche, wenn Sie die Authentifizierungsoption für einzelne Konten auswählen.

Die Blazor Web App-Vorlage erstellt ein Identity-Codegerüst für eine SQL Server-Datenbank. Die Befehlszeilenversion verwendet SQLite und enthält eine SQLite-Datenbank für Identity.

Die -Vorlage:

  • Unterstützt Szenarien für interaktives serverseitiges Rendering (interactive SSR) und clientseitiges Rendering (CSR) mit authentifizierten Benutzenden.
  • Fügt IdentityRazor-Komponenten und zugehörige Logik für routinemäßige Authentifizierungsaufgaben hinzu, wie z. B. das An- und Abmelden von Benutzenden. Die Identity-Komponenten unterstützen auch erweiterte Identity-Funktionen, wie z. B. Kontobestätigung und Kennwortwiederherstellung und Multi-Faktor-Authentifizierung mithilfe einer Drittanbieter-App. Beachten Sie, dass die Identity-Komponenten selbst keine Interaktivität unterstützen.
  • Fügt die zu Identity zugehörigen Pakete und Abhängigkeiten hinzu
  • Verweist auf die Identity-Pakete in _Imports.razor
  • Erstellt eine benutzerdefinierte Identity-Klasse für Benutzer*innen (ApplicationUser).
  • Erstellt und registriert einen EF Core-Datenbankkontext (ApplicationDbContext).
  • Konfiguriert das Routing für die integrierten Identity-Endpunkte.
  • Umfasst die Validierungs- und Geschäftslogik von Identity

Um die Identity-Komponenten des Blazor-Frameworks zu untersuchen, greifen Sie darauf in den Ordnern Pages und Shared des Ordners Account in der Blazor Web App-Projektvorlage (Verweisquelle) zu.

Wenn Sie die interaktiven WebAssembly- oder interaktiven Auto-Rendermodi auswählen, verarbeitet der Server alle Authentifizierungs- und Autorisierungsanforderungen und die Identity-Komponenten werden statisch auf dem Server im Hauptprojekt der Blazor Web App gerendert.

Das Framework stellt einen benutzerdefiniertenAuthenticationStateProvider sowohl im Server- als auch im Clientprojekt (.Client) bereit, um den Authentifizierungsstatus des der Benutzerin oder des Benutzers an den Browser zu übertragen. Das Serverprojekt ruft AddAuthenticationStateSerialization auf, während das Clientprojekt AddAuthenticationStateDeserialization aufruft. Die Authentifizierung auf dem Server statt auf dem Client ermöglicht der Anwendung den Zugriff auf den Authentifizierungsstatus während des Prerenderings und vor der Initialisierung der .NET WebAssembly-Laufzeit. Die benutzerdefinierten AuthenticationStateProvider-Implementierungen verwenden den Dienst Persistent Component State (PersistentComponentState), um den Authentifizierungsstatus in HTML-Kommentare zu serialisieren und ihn dann von WebAssembly zurückzulesen, um eine neue AuthenticationState-Instanz zu erstellen. Weitere Informationen finden Sie im Abschnitt Verwalten des Authentifizierungsstatus in Blazor Web Apps.

Nur für Interactive Server-Lösungen handelt es sich bei IdentityRevalidatingAuthenticationStateProvider (Referenzquelle) um einen serverseitigen AuthenticationStateProvider, der alle 30 Minuten den Sicherheitsstempel für das verbundene Benutzerkonto revalidiert, solange eine interaktive Verbindung besteht.

Wenn Sie die interaktiven WebAssembly- oder interaktiven Auto-Rendermodi auswählen, verarbeitet der Server alle Authentifizierungs- und Autorisierungsanforderungen und die Identity-Komponenten werden statisch auf dem Server im Hauptprojekt der Blazor Web App gerendert. Die Projektvorlage enthält eine PersistentAuthenticationStateProvider-Klasse (Verweisquelle) im .Client-Projekt, um den Authentifizierungsstatus von Benutzer*innen zwischen dem Server und dem Browser zu synchronisieren. Die Klasse ist eine benutzerdefinierte Implementierung von AuthenticationStateProvider. Der Anbieter verwendet den Dienst Persistent Component State (PersistentComponentState), um den Authentifizierungsstatus zu prerendern und auf der Seite beizubehalten.

Im Hauptprojekt einer Blazor Web App heißt der Authentifizierungsstatusanbieter entweder IdentityRevalidatingAuthenticationStateProvider (Verweisquelle) (nur Serverinteraktivitätslösungen) oder PersistingRevalidatingAuthenticationStateProvider (Verweisquelle) (WebAssembly- oder Auto-Interaktivitätslösungen).

BlazorIdentity hängt von DbContext Instanzen ab, die nicht von einer Factoryerstellt wurden, was beabsichtigt ist, da DbContext die Komponenten der Projektvorlage Identity ausreichen, um statisch zu rendern, ohne Interaktivität zu unterstützen.

Eine Beschreibung, wie globale interaktive Rendermodi auf Nicht-Identity-Komponenten angewandt werden und gleichzeitig statisches SSR für die Identity-Komponenten erzwungen wird, finden Sie unter ASP.NET Core-Rendermodi Blazor.

Weitere Informationen zum Speichern des vorab gerenderten Status finden Sie unter Vorabrendern von ASP.NET Core Razor-Komponenten.

Hinweis

Dokumentationslinks zur .NET-Referenzquelle laden in der Regel den Standardbranch des Repositorys, der die aktuelle Entwicklung für das nächste Release von .NET darstellt. Um ein Tag für ein bestimmtes Release auszuwählen, wählen Sie diesen mit der Dropdownliste Switch branches or tags (Branches oder Tags wechseln) aus. Weitere Informationen finden Sie unter How to select a version tag of ASP.NET Core source code (dotnet/AspNetCore.Docs #26205) (Auswählen eines Versionstags von ASP.NET Core-Quellcode (dotnet/AspNetCore.Docs #26205)).

Verwalten des Authentifizierungsstatus in Blazor Web Apps

Dieser Abschnitt gilt für Blazor Web Apps, die Folgendes nutzen:

  • Individuelle Konten
  • Clientseitiges Rendering (CSR, WebAssembly-basierte Interaktivität).

Ein clientseitiger Authentifizierungsstatusanbieter wird nur in Blazor verwendet und nicht in das ASP.NET Core-Authentifizierungssystem integriert. Beim Vorabrendering berücksichtigt Blazor die auf der Seite definierten Metadaten und verwendet das ASP.NET Core-Authentifizierungssystem, um zu ermitteln, ob der/die Benutzer*in authentifiziert ist. Wenn Benutzer*innen von einer Seite zu einer anderen navigieren, wird ein clientseitiger Authentifizierungsanbieter verwendet. Wenn Benutzer*innen die Seite aktualisieren (Neuladen der ganzen Seite), ist der clientseitige Authentifizierungsstatusanbieter nicht an der Authentifizierungsentscheidung auf dem Server beteiligt. Da der Status der Benutzer*innen vom Server nicht beibehalten wird, gehen alle clientseitig verwalteten Authentifizierungsstatus verloren.

Um dies zu beheben sollten Sie am besten die Authentifizierung im ASP.NET Core-Authentifizierungssystem durchzuführen. Der clientseitige Authentifizierungsstatusanbieter hat dann nur noch die Aufgabe, den Authentifizierungsstatus der Benutzer*innen anzuzeigen. Beispiele dafür, wie Sie dies mit verschiedenen Authentifizierungsstatusanbietern erreichen, finden Sie in der Projektvorlage für Blazor Web App und in der Beschreibung unten.

Rufen Sie in der Datei Program des Serverprojekts AddAuthenticationStateSerialization auf. Dadurch wird die AuthenticationState serialisiert, die vom Server AuthenticationStateProvider zurückgegeben wird. Dies geschieht mithilfe des Diensts Persistent Component State (PersistentComponentState):

builder.Services.AddRazorComponents()
    .AddInteractiveWebAssemblyComponents()
    .AddAuthenticationStateSerialization();

Die API serialisiert nur die serverseitigen Namens- und Rollenansprüche für den Zugriff im Browser. Um alle Ansprüche einzuschließen, legen Sie SerializeAllClaims auf true fest (im serverseitigen Aufruf AddAuthenticationStateSerialization):

builder.Services.AddRazorComponents()
    .AddInteractiveWebAssemblyComponents()
    .AddAuthenticationStateSerialization(
        options => options.SerializeAllClaims = true);

Rufen Sie im Client (.Client) in der Projektdatei Program AddAuthenticationStateDeserialization auf, das einen AuthenticationStateProvider hinzufügt, wo der AuthenticationState deserialisiert wird. Dies geschieht mit AuthenticationStateData und dem Dienst Persistent Component State (PersistentComponentState). Es sollte ein entsprechender Aufruf von AddAuthenticationStateSerialization im Serverprojekt vorhanden sein.

builder.Services.AddAuthorizationCore();
builder.Services.AddCascadingAuthenticationState();
builder.Services.AddAuthenticationStateDeserialization();

Hinweis

Dokumentationslinks zur .NET-Referenzquelle laden in der Regel den Standardbranch des Repositorys, der die aktuelle Entwicklung für das nächste Release von .NET darstellt. Um ein Tag für ein bestimmtes Release auszuwählen, wählen Sie diesen mit der Dropdownliste Switch branches or tags (Branches oder Tags wechseln) aus. Weitere Informationen finden Sie unter How to select a version tag of ASP.NET Core source code (dotnet/AspNetCore.Docs #26205) (Auswählen eines Versionstags von ASP.NET Core-Quellcode (dotnet/AspNetCore.Docs #26205)).

Gerüst Identity

Weitere Informationen zum Gerüstbau für Identity in einer serverseitigen Blazor-App finden Sie unter Gerüstbau für Identity in ASP.NET Core-Projekten.

Gerüstbau für Identity in einer serverseitigen Blazor-App:

Zusätzliche Ansprüche und Token von externen Anbietern

Informationen zum Speichern zusätzlicher Ansprüche von externen Anbietern finden Sie unter Beibehalten zusätzlicher Ansprüche und Token von externen Anbietern in ASP.NET Core.

Azure App Service für Linux mit Identity Server

Geben Sie den Zertifikataussteller explizit an, wenn Sie eine Bereitstellung auf Azure App Service für Linux mit Identity Server durchführen. Weitere Informationen finden Sie unter Verwenden von Identity zum Sichern eines Web-API-Back-Ends für SPAs.

Injizieren Sie AuthenticationStateProvider für Dienste, die einer Komponente zugeordnet sind.

Versuchen Sie nicht, AuthenticationStateProvider innerhalb eines benutzerdefinierten Bereichs aufzulösen, da dies zur Erstellung einer neuen Instanz von AuthenticationStateProvider führt, die nicht ordnungsgemäß initialisiert wird.

Um auf AuthenticationStateProvider innerhalb eines Diensts zuzugreifen, der einer Komponente zugeordnet ist, injizieren Sie AuthenticationStateProvider mit der @inject-Direktive oder dem [Inject]-Attribut und übergeben den Wert als Parameter an den Dienst. Dieser Ansatz stellt sicher, dass die richtige, initialisierte Instanz von AuthenticationStateProvider für jede Benutzer-App-Instanz verwendet wird.

ExampleService.cs:

public class ExampleService
{
    public async Task<string> ExampleMethod(AuthenticationStateProvider authStateProvider)
    {
        var authState = await authStateProvider.GetAuthenticationStateAsync();
        var user = authState.User;

        if (user.Identity is not null && user.Identity.IsAuthenticated)
        {
            return $"{user.Identity.Name} is authenticated.";
        }
        else
        {
            return "The user is NOT authenticated.";
        }
    }
}

Registrieren Sie den Dienst als bereichsbezogen. In einer serverseitigen Blazor-App verfügen bereichsbezogene Dienste über eine Lebensdauer, die der Dauer der Clientverbindung entspricht.

Gehen Sie in der Program-Datei folgendermaßen vor:

builder.Services.AddScoped<ExampleService>();

In Startup.ConfigureServices von Startup.cs:

services.AddScoped<ExampleService>();

In der folgenden InjectAuthStateProvider-Komponente:

InjectAuthStateProvider.razor:

@page "/inject-auth-state-provider"
@inherits OwningComponentBase
@inject AuthenticationStateProvider AuthenticationStateProvider

<h1>Inject <code>AuthenticationStateProvider</code> Example</h1>

<p>@message</p>

@code {
    private string? message;
    private ExampleService? ExampleService { get; set; }

    protected override async Task OnInitializedAsync()
    {
        ExampleService = ScopedServices.GetRequiredService<ExampleService>();

        message = await ExampleService.ExampleMethod(AuthenticationStateProvider);
    }
}
@page "/inject-auth-state-provider"
@inject AuthenticationStateProvider AuthenticationStateProvider
@inherits OwningComponentBase

<h1>Inject <code>AuthenticationStateProvider</code> Example</h1>

<p>@message</p>

@code {
    private string? message;
    private ExampleService? ExampleService { get; set; }

    protected override async Task OnInitializedAsync()
    {
        ExampleService = ScopedServices.GetRequiredService<ExampleService>();

        message = await ExampleService.ExampleMethod(AuthenticationStateProvider);
    }
}

Weitere Informationen finden Sie in den Anleitungen zu OwningComponentBase unter ASP.NET Core Blazor-Abhängigkeitsinjektion.

Anzeige nicht autorisierter Inhalte beim Vorabendern mit einem benutzerdefinierten AuthenticationStateProvider

Um zu verhindern, dass unzulässige Inhalte, z.B. Inhalte in einer AuthorizeViewKomponente, während des Prerenderings mit einer benutzerdefinierten AuthenticationStateProvider Anwendung angezeigt werden, wählen Sie einen der folgenden Ansätze:

  • Vorabrendering deaktivieren: Geben Sie den Rendermodus der Komponente auf der höchsten Ebene in der App-Hierarchie an, die keine Stammkomponente ist. Legen Sie den Parameter prerender dabei auf false fest.

    Hinweis

    Die Interaktivität einer Stammkomponente, wie z. B. der App-Komponente, wird nicht unterstützt. Daher kann die Voreinstellung nicht direkt von der App-Komponente deaktiviert werden.

    Bei Apps, die auf der Blazor Web App-Projektvorlage basieren, ist das Voarabrendering in der Regel deaktiviert, wenn die Routes-Komponente in der App-Komponente (Components/App.razor) verwendet wird:

    <Routes @rendermode="new InteractiveServerRenderMode(prerender: false)" />
    

    Deaktivieren Sie außerdem das Vorabrendering für die HeadOutlet-Komponente:

    <HeadOutlet @rendermode="new InteractiveServerRenderMode(prerender: false)" />
    

    Sie können den auf die Routes-Komponenteninstanz angewendeten Rendermodus auch selektiv steuern. Siehe z. B. ASP.NET Core Blazor Rendermodi.

  • Deaktivieren des Vorabrenderings: Öffnen Sie die _Host.cshtml-Datei, und ändern Sie das render-mode-Attribut des Komponententag-Hilfsprogramms in Server:

    <component type="typeof(App)" render-mode="Server" />
    
  • Authentifizieren des Benutzers auf dem Server, bevor die App gestartet wird: Bei diesem Ansatz muss die App mit der Identity-basierten Anmeldeseite oder -ansicht auf die anfängliche Anforderung eines Benutzers reagieren und alle Anforderungen an Blazor-Endpunkte verhindern, bis sie authentifiziert werden. Weitere Informationen finden Sie unter Erstellen einer ASP.NET Core-App mit Benutzerdaten, die durch Autorisierung geschützt sind. Nach der Authentifizierung werden nicht autorisierte Inhalte in vorab gerenderten Razor-Komponenten nur angezeigt, wenn der Benutzer wirklich nicht berechtigt ist, den Inhalt anzuzeigen.

User State management

Trotz des Worts „State“ (Zustand) im Namen dient AuthenticationStateProvider nicht zum Speichern des allgemeinen Benutzerzustands. AuthenticationStateProvider gibt nur den Authentifizierungsstatus des Benutzers für die App an, ob er bei der App angemeldet ist und in welchem Namen er angemeldet ist.

Die Authentifizierung verwendet dieselbe ASP.NET Core IdentityAuthentifizierung wie Razor Pages- und MVC-Apps. Der für ASP.NET Core Identity gespeicherte Benutzerzustand wird an Blazor übermittelt, ohne der App zusätzlichen Code hinzuzufügen. Befolgen Sie die Anleitungen in den ASP.NET Core Identity-Artikeln und den Tutorials für die Identity-Features, die in den Blazor-Teilen der App wirksam werden sollen.

Anleitungen zur allgemeinen Zustandsverwaltung außerhalb von ASP.NET Core Identity finden Sie unter ASP.NET Core Blazor-Zustandsverwaltung.

Zusätzliche Authentifizierungsstatusanbieter

Zwei zusätzliche Klassen, die von hilfe beim AuthenticationStateProvider Verwalten des Authentifizierungsstatus auf dem Server abgeleitet werden:

Hinweis

Dokumentationslinks zur .NET-Referenzquelle laden in der Regel den Standardbranch des Repositorys, der die aktuelle Entwicklung für das nächste Release von .NET darstellt. Um ein Tag für ein bestimmtes Release auszuwählen, wählen Sie diesen mit der Dropdownliste Switch branches or tags (Branches oder Tags wechseln) aus. Weitere Informationen finden Sie unter How to select a version tag of ASP.NET Core source code (dotnet/AspNetCore.Docs #26205) (Auswählen eines Versionstags von ASP.NET Core-Quellcode (dotnet/AspNetCore.Docs #26205)).

Verwaltung des Authentifizierungsstatus beim Abmelden

Der serverseitige Blazor speichert den Authentifizierungsstatus der Benutzenden für die gesamte Lebensdauer des Schaltkreises, auch über Browser-Registerkarten hinweg. Um Benutzende automatisch von allen Browser-Registerkarten abzumelden, wenn sie sich auf einer Registerkarte abmelden, müssen Sie RevalidatingServerAuthenticationStateProvider (Referenzquelle) und ein kurzes RevalidationInterval implementieren.

Hinweis

Dokumentationslinks zur .NET-Referenzquelle laden in der Regel den Standardbranch des Repositorys, der die aktuelle Entwicklung für das nächste Release von .NET darstellt. Um ein Tag für ein bestimmtes Release auszuwählen, wählen Sie diesen mit der Dropdownliste Switch branches or tags (Branches oder Tags wechseln) aus. Weitere Informationen finden Sie unter How to select a version tag of ASP.NET Core source code (dotnet/AspNetCore.Docs #26205) (Auswählen eines Versionstags von ASP.NET Core-Quellcode (dotnet/AspNetCore.Docs #26205)).

Gültigkeitsdauer der temporären Umleitungs-URL

Dieser Abschnitt gilt für Blazor Web Apps.

Verwenden Sie die Option RazorComponentsServiceOptions.TemporaryRedirectionUrlValidityDuration, um die Gültigkeitsdauer des ASP.NET Core Data Protection für temporäre Umleitungs-URLs festzulegen, die durch das Blazor-serverseitige Rendering ausgegeben werden. Diese werden nur vorübergehend verwendet, sodass die Lebensdauer nur lang genug sein muss, damit ein Client die URL empfängt und mit der Navigation zu dieser beginnt. Sie sollte jedoch auch lang genug sein, um eine serverübergreifende Zeitdehnung zu ermöglichen. Der Standardwert beträgt 5 Minuten.

Im folgenden Beispiel wird der Wert auf sieben Minuten verlängert:

builder.Services.AddRazorComponents(options => 
    options.TemporaryRedirectionUrlValidityDuration = 
        TimeSpan.FromMinutes(7));

Zusätzliche Ressourcen