Token di rinnovo e scadenza
Implementi il rinnovo sicuro dei token.
Token di rinnovo e scadenza è una lezione C# Academy gratuita su CoddyKit. Questa è la lezione 4 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento C# Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso C# Academy include 4 lezioni in totale.
Il problema della scadenza
I token di accesso di breve durata sono sicuri ma scomodi: costringere gli utenti a effettuare nuovamente l'accesso ogni 15 minuti offre una pessima esperienza utente.
La soluzione è un refresh token, una credenziale separata e con durata maggiore, utilizzata per ottenere nuovi token di accesso senza reinserire la password.
// access token: 15 minutes
// refresh token: 7-30 daysCos'è un refresh token
Un refresh token è in genere una stringa casuale opaca (non un JWT). Poiché ha una lunga durata, deve essere archiviato sul server per poterlo revocare.
Lo generi con un generatore di numeri casuali crittograficamente sicuro.
public static string GenerateRefreshToken()
{
var bytes = new byte[64];
using var rng = RandomNumberGenerator.Create();
rng.GetBytes(bytes);
return Convert.ToBase64String(bytes);
}Archiviazione dei refresh token
Salvi ogni refresh token insieme al relativo proprietario, alla scadenza e a un flag di revoca. In questo modo potrà invalidarlo in caso di disconnessione o furto.
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; }
}Emissione di entrambi i token all'accesso
Dopo un accesso riuscito, restituisca il token di accesso di breve durata e un nuovo refresh token. Salvi il refresh token nel database.
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 });L'endpoint di refresh
Un endpoint /refresh dedicato accetta un refresh token e, se valido, emette un token di accesso completamente nuovo.
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 });
});Rotazione dei refresh token
La rotazione rende il flusso più sicuro: ogni volta che un refresh token viene usato, lo revochi ed emetta un token nuovo. Un token sottratto e già utilizzato diventa quindi inutilizzabile.
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();Rilevamento del riutilizzo dei token
Con la rotazione è possibile rilevare un furto: se viene presentato nuovamente un token già revocato, lo consideri una violazione e revochi l'intera famiglia di token dell'utente.
if (stored.IsRevoked)
{
// This token was already used - likely stolen.
await RevokeAllUserTokens(stored.UserId, db);
return Results.Unauthorized();
}Disconnessione e revoca
La disconnessione revoca semplicemente il refresh token corrente. Il token di accesso scadrà autonomamente entro pochi minuti.
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();Dove archiviare i token sul client
Per i browser, il metodo più sicuro consiste nel memorizzare il refresh token in un cookie HttpOnly, Secure, in modo che JavaScript non possa leggerlo, riducendo il rischio di furto tramite XSS.
Il token di accesso di breve durata può essere conservato in memoria.
Response.Cookies.Append("refresh", refresh.Token, new CookieOptions
{
HttpOnly = true,
Secure = true,
SameSite = SameSiteMode.Strict,
Expires = refresh.ExpiresAt
});Eliminazione dei token scaduti
I refresh token si accumulano. Esegua periodicamente un processo in background (ad esempio, un servizio ospitato) per eliminare le righe scadute o revocate.
await db.RefreshTokens
.Where(r => r.ExpiresAt < DateTime.UtcNow || r.IsRevoked)
.ExecuteDeleteAsync();Scelta delle durate
Bilanci sicurezza e comodità:
- Token di accesso: 5-15 minuti, per limitare l'esposizione di un token sottratto.
- Refresh token: da alcune ore a diverse settimane, in base alla sensibilità.
- Utilizzi la rotazione per qualsiasi durata superiore a un giorno.
AccessTokenLifetime = TimeSpan.FromMinutes(15);
RefreshTokenLifetime = TimeSpan.FromDays(7);Verifica rapida
Verifichi la comprensione del flusso di refresh.
Riepilogo
Ha implementato il flusso dei refresh token:
- Emetta un token di accesso breve insieme a un refresh token lungo, opaco e archiviato sul server.
- Un endpoint
/refreshscambia un refresh token valido con un nuovo token di accesso. - La rotazione e il rilevamento del riutilizzo aumentano la protezione contro i furti.
- Conservi i refresh token in cookie HttpOnly ed elimini le righe scadute.
Il corso sull'autenticazione JWT è così completato.
Impara C# con un tutor IA — gratis
Scrivi ed esegui vero codice nel tuo browser, ricevi aiuto istantaneo da un tutor IA disponibile 24/7, e riprendi da dove hai lasciato sul web o nell'app.
- Corsi
- 93
- Lezioni
- 346
Domande Frequenti
La lezione «Token di rinnovo e scadenza» è gratuita?
Sì — il testo completo di «Token di rinnovo e scadenza» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso C# Academy, passa a CoddyKit PRO. Il corso C# Academy include 4 lezioni in totale.
Cosa imparerò in «Token di rinnovo e scadenza»?
Implementi il rinnovo sicuro dei token. Eserciti C# Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare C# Academy?
Non è richiesta alcuna esperienza precedente. C# Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 4 di 4.
Quanto tempo richiede la lezione «Token di rinnovo e scadenza»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione C# Academy?
Sì. Ogni lezione C# Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Struttura e claim JWT
- Configurazione dell'autenticazione JWT Bearer
- Emissione dei token
- Token di rinnovo e scadenza