Non sono sicuro, ma sto pensando che forse esiste un problema XY in questa domanda.
Questa è la mia ipotesi sul tuo scenario:
- Il browser dell'utente tenta di accedere a una funzione dell'applicazione limitata
- L'applicazione invia il browser al sito Web dell'identità per ottenere un token artefatto o portatore contenente l'autorizzazione necessaria per utilizzare la funzione riservata
- Il sito Web Identity verifica l'identità dell'utente, genera un artefatto che indica che le autorizzazioni sono corrette per l'operazione, lo firma e lo restituisce al browser
- Il browser accede alla funzione riservata, ma questa volta con il token che indica che l'utente ha le autorizzazioni necessarie.
- L'applicazione legge il token ed esegue l'operazione.
In questo caso, sei preoccupato che il token al portatore, che scorre su Internet al browser dell'utente, possa essere sostituito con un token al portatore ottenuto in precedenza, per un utente diverso che potrebbe avere più permessi.
Tuttavia, non si desidera impedire completamente la riproduzione. Ad esempio, se il passaggio 4 non riesce a causa di un problema di rete, l'utente dovrebbe essere in grado di aggiornare la pagina e riprovare, e lo stesso token verrà nuovamente inviato. Questo è perfettamente OK.
Quello che vuoi evitare è che l'utente invii un token / artefatto da un altro utente. Oppure se le autorizzazioni dell'utente sono state revocate un giorno fa, non vuoi che l'utente invii il proprio token da due giorni fa.
Tutto ciò che ti serve è assicurarti
- L'artefatto identifica l'utente
- Gli identificativi delle risorse utente l'autorizzazione
- L'artefatto indica un periodo durante il quale l'autorizzazione è concessa all'utente
- L'artefatto è firmato in un modo che può essere validato
Se fai tutto quanto sopra, non è necessario bloccare la riproduzione. Bene, tecnicamente l'articolo 3 qui sopra include un intervallo di date, quindi è una specie di debole attenuazione del replay. Ma l'idea che ogni token debba essere generato nel contesto di una sfida casuale e di una risposta non è corretta: il server di identità deve semplicemente dichiarare ("asserire") che un utente, un permesso e una finestra temporale appartengono tutti insieme e firmarlo . Fare ciò impedirà il tipo di attacchi che penso tu sia preoccupato.
Per favore correggimi se le mie ipotesi non sono corrette.