234 messaggi dal 08 marzo 2012
Ciao a tutti,

sto sviluppando un'app che si interfaccia con dei servizi su .NET Core.
Per accedere all'app bisogna autenticarsi (uso un token JWT emesso dal server).
Ora la mia necessità è quella di impedire che 2 diverse persone possano loggarsi contemporaneamente con la stessa utenza.

Naturalmente, essendo un'app mobile, non posso fidarmi che l'utente faccia logout perché, come è normale che sia, uno chiude l'app quando gli pare con le classiche funzioni di iOS o Android.
Inutile dire che i servizi sono stateless, quindi naturalmente non fanno uso di sessioni lato server.

Le mie domande quindi sono:

- come posso emettere un token solo se quell'utente non ha già una "sessione" attiva e aperta?
- come posso permettere ad un utente di accedere se chi c'era in precedenza non ha fatto logout ma di fatto ha chiuso l'app e quindi a tutti gli effetti non la sta usando?

Vorrei evitare di creare delle tabelle di appoggio, sarebbe corretto in questo caso fare uso della cache di Asp.Net?

Grazie!
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,
forse te la puoi cavare cambiando il security stamp ad ogni nuovo login.
Leggi qui, vedi se fa al caso tuo.
https://forum.aspitalia.com/forum/post/424763/Limitate-Utente-Singole-Sessioni--Connessioni.aspx
https://www.aspitalia.com/script/1308/Invalidare-Token-JWT-Scadenza-ASP.NET-Core-Identity.aspx

ciao,
Moreno
Modificato da BrightSoul il 27 ottobre 2019 15:27 -

Enjoy learning and just keep making
234 messaggi dal 08 marzo 2012
Io non uso Asp.Net Core Identity, si riesce comunque ad applicare la soluzione che suggerisci?

Grazie e ciao!
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao, puoi comunque imitare il comportamento del security stamp.
  • Al login con username e password generi un nuovo security stamp e lo salvi sul record dell'utente, in un campo apposito;
  • Includi tale security stamp nel JWT come claim;
  • Alla successiva richiesta dell'utente, verifichi se il security stamp è ancora lo stesso che si trova nel database;
  • (Opzionale) usa il servizio IMemoryCache per evitare di fare questo controllo ad ogni singola richiesta.


ciao,
Moreno

Enjoy learning and just keep making
234 messaggi dal 08 marzo 2012
Ok, chiaro ma come gestisco il "mancato logout" dell'utente?

Nel senso genero un security stampa e lo verifico ad ogni chiamata (eventualmente tramite cache).
Mi è chiaro che questo impedisca all'utente B di accedere contemporaneamente con l'utente A utilizzando la medesima username.
Se però l'utente A chiude l'app e subito dopo la riapre, come posso lato server concedergli l'accesso dato che anche in questo caso i security stamp non combaciano più?

Forse mi sfugge qualcosa...

Grazie!
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,


Mi è chiaro che questo impedisca all'utente B di accedere contemporaneamente con l'utente A utilizzando la medesima username.

L'utente B riuscirà ad accedere mentre l'utente A verrà "buttato fuori" perché il security stamp nel suo token non sarà più attuale, dato che l'utente B ne ha causato la rigenerazione al login.


mancato logout

Il mancato logout non è un problema perché se passano più di tot minuti, il token scadrà da solo e perciò non sarà più valido alla riapetura dell'applicazione.

Se invece l'utente riapre l'applicazione prima della scadenza del token, beh, riuscirà a collegarsi. Ma è un problema?
Se è un problema, salva il token in un cookie di sessione in modo che venga automaticamente eliminato alla chiusura del browser. Oppure conservalo nel sessionStorage e verrà eliminato alla chiusura della tab.

ciao,
Moreno
Modificato da BrightSoul il 28 ottobre 2019 22:53 -

Enjoy learning and just keep making

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.