Refresh-Tokens und Ablauf
Implementieren Sie eine sichere Token-Erneuerung.
Refresh-Tokens und Ablauf ist eine kostenlose C# Academy-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des C# Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der C# Academy-Kurs umfasst insgesamt 4 Lektionen.
Das Problem mit dem Ablauf
Kurzlebige Access-Tokens sind sicher, aber unpraktisch: Benutzer alle 15 Minuten zu einer erneuten Anmeldung zu zwingen, sorgt für eine schlechte Benutzererfahrung.
Die Lösung ist ein Refresh-Token – eine separate, langlebigere Anmeldeinformation, mit der neue Access-Tokens abgerufen werden können, ohne das Passwort erneut einzugeben.
// access token: 15 minutes
// refresh token: 7-30 daysWas ein Refresh-Token ist
Ein Refresh-Token ist normalerweise eine undurchsichtige zufällige Zeichenfolge (kein JWT). Da es langlebig ist, muss es serverseitig gespeichert werden, damit es widerrufen werden kann.
Erzeugen Sie es mit einem kryptografisch sicheren Zufallszahlengenerator.
public static string GenerateRefreshToken()
{
var bytes = new byte[64];
using var rng = RandomNumberGenerator.Create();
rng.GetBytes(bytes);
return Convert.ToBase64String(bytes);
}Refresh-Tokens speichern
Speichern Sie jedes Refresh-Token zusammen mit seinem Besitzer, dem Ablaufzeitpunkt und einem Widerrufskennzeichen. So können Sie es bei der Abmeldung oder im Fall eines Diebstahls ungültig machen.
public class RefreshToken
{
public int Id { get; set; }
public string Token { get; set; } = default!;
public int UserId { get; set; }
public DateTime ExpiresAt { get; set; }
public bool IsRevoked { get; set; }
}Beide Tokens beim Login ausstellen
Geben Sie bei einer erfolgreichen Anmeldung sowohl das kurzlebige Access-Token als auch ein neues Refresh-Token zurück. Speichern Sie das Refresh-Token in der Datenbank.
var access = tokenService.CreateAccessToken(user);
var refresh = new RefreshToken
{
Token = TokenService.GenerateRefreshToken(),
UserId = user.Id,
ExpiresAt = DateTime.UtcNow.AddDays(7)
};
db.RefreshTokens.Add(refresh);
await db.SaveChangesAsync();
return Results.Ok(new { access, refresh = refresh.Token });Der Refresh-Endpunkt
Ein dedizierter Endpunkt /refresh akzeptiert ein Refresh-Token und stellt bei dessen Gültigkeit ein brandneues Access-Token aus.
app.MapPost("/refresh", async (RefreshDto dto, AppDb db, TokenService tokens) =>
{
var stored = await db.RefreshTokens
.SingleOrDefaultAsync(r => r.Token == dto.RefreshToken);
if (stored is null || stored.IsRevoked ||
stored.ExpiresAt < DateTime.UtcNow)
return Results.Unauthorized();
var user = await db.Users.FindAsync(stored.UserId);
var access = tokens.CreateAccessToken(user!);
return Results.Ok(new { access });
});Rotation von Refresh-Tokens
Die Rotation erhöht die Sicherheit des Ablaufs: Widerrufen Sie ein Refresh-Token jedes Mal, wenn es verwendet wird, und stellen Sie ein neues aus. Ein gestohlenes, bereits verwendetes Token ist danach unbrauchbar.
stored.IsRevoked = true; // burn the old one
var next = new RefreshToken
{
Token = TokenService.GenerateRefreshToken(),
UserId = stored.UserId,
ExpiresAt = DateTime.UtcNow.AddDays(7)
};
db.RefreshTokens.Add(next);
await db.SaveChangesAsync();Wiederverwendung von Tokens erkennen
Mit Rotation können Sie einen Diebstahl erkennen: Wenn ein bereits widerrufenes Token erneut vorgelegt wird, behandeln Sie dies als Sicherheitsverletzung und widerrufen Sie die gesamte Token-Familie des Benutzers.
if (stored.IsRevoked)
{
// This token was already used - likely stolen.
await RevokeAllUserTokens(stored.UserId, db);
return Results.Unauthorized();
}Abmeldung und Widerruf
Bei der Abmeldung wird einfach das aktuelle Refresh-Token widerrufen. Das Access-Token läuft innerhalb weniger Minuten von selbst ab.
app.MapPost("/logout", async (RefreshDto dto, AppDb db) =>
{
var stored = await db.RefreshTokens
.SingleOrDefaultAsync(r => r.Token == dto.RefreshToken);
if (stored is not null) stored.IsRevoked = true;
await db.SaveChangesAsync();
return Results.Ok();
}).RequireAuthorization();Wo Tokens auf dem Client gespeichert werden
Für Browser ist es am sichersten, das Refresh-Token in einem HttpOnly- und Secure-Cookie zu speichern, sodass JavaScript es nicht lesen kann und der Diebstahl durch XSS erschwert wird.
Das kurzlebige Access-Token kann im Arbeitsspeicher aufbewahrt werden.
Response.Cookies.Append("refresh", refresh.Token, new CookieOptions
{
HttpOnly = true,
Secure = true,
SameSite = SameSiteMode.Strict,
Expires = refresh.ExpiresAt
});Abgelaufene Tokens bereinigen
Refresh-Tokens sammeln sich mit der Zeit an. Führen Sie regelmäßig einen Hintergrundprozess (z. B. einen gehosteten Service) aus, um abgelaufene oder widerrufene Datensätze zu löschen.
await db.RefreshTokens
.Where(r => r.ExpiresAt < DateTime.UtcNow || r.IsRevoked)
.ExecuteDeleteAsync();Gültigkeitsdauern festlegen
Finden Sie ein Gleichgewicht zwischen Sicherheit und Komfort:
- Access-Token: 5–15 Minuten – begrenzt die Gefährdung durch ein offengelegtes Token.
- Refresh-Token: mehrere Stunden bis Wochen, abhängig von der Sensibilität.
- Verwenden Sie für Laufzeiten von mehr als einem Tag eine Rotation.
AccessTokenLifetime = TimeSpan.FromMinutes(15);
RefreshTokenLifetime = TimeSpan.FromDays(7);Kurzer Test
Testen Sie Ihr Verständnis des Refresh-Ablaufs.
Zusammenfassung
Sie haben den Ablauf mit Refresh-Tokens implementiert:
- Stellen Sie ein kurzlebiges Access-Token sowie ein langes, undurchsichtiges, serverseitig gespeichertes Refresh-Token aus.
- Ein
/refresh-Endpunkt tauscht ein gültiges Refresh-Token gegen ein neues Access-Token. - Rotation und die Erkennung von Wiederverwendung erhöhen die Sicherheit gegen Diebstahl.
- Speichern Sie Refresh-Tokens in HttpOnly-Cookies und bereinigen Sie abgelaufene Datensätze.
Damit ist der Kurs zur JWT-Authentifizierung abgeschlossen.
Lerne C# mit einem KI-Tutor — kostenlos
Schreibe und führe echten Code in deinem Browser aus, bekomme sofortige Hilfe von einem 24/7 KI-Tutor und setze dein Lernen im Web oder in der App fort.
- Kurse
- 93
- Lektionen
- 346
Häufig gestellte Fragen
Ist die Lektion „Refresh-Tokens und Ablauf“ kostenlos?
Ja — der vollständige Text von „Refresh-Tokens und Ablauf“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des C# Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der C# Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Refresh-Tokens und Ablauf“?
Implementieren Sie eine sichere Token-Erneuerung. Du übst C# Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um C# Academy zu starten?
Keine Vorkenntnisse erforderlich. C# Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.
Wie lange dauert die Lektion „Refresh-Tokens und Ablauf“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser C# Academy-Lektion Code schreiben und ausführen?
Ja. Jede C# Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- JWT-Struktur und Claims
- JWT-Bearer-Authentifizierung konfigurieren
- Tokens ausstellen
- Refresh-Tokens und Ablauf