64 messaggi dal 08 giugno 2010
Salve a tutti,
Sto creando un applicazione asp net core con pagine razor, ho già implementato aspnet core identity per la gestione degli accessi e dei ruoli. Adesso vorrei limitare ogni singolo utente a singole sessioni di lavoro.
Non so se mi sono spiegato: vorrei che se l'utente pasquale sta lavorando con un dispositivo non può lavorare contemporaneamente con un altro dispositivo, quindi impedire più accessi contemporaneamente con quelle credenziali.

Grazie infinite per la vostra disponibilità.
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,


ho già implementato aspnet core identity per la gestione degli accessi e dei ruoli. Adesso vorrei limitare ogni singolo utente a singole sessioni di lavoro.

Bene, per questo puoi sfruttare il Security Stamp. E' un codice che si trova nella tabella degli utenti e che viene incluso automaticamente in ogni cookie di autenticazione. Può essere usato per risolvere il tuo problema ma dovrai fare queste due cose:
  • Nel metodo ConfigureServices della classe Startup mettere questo codice:
    services.Configure<SecurityStampValidatorOptions>(options => 
        options.ValidationInterval = TimeSpan.FromSeconds(60));
    

    In questo modo, ASP.NET Core verificherà se il security stamp fornito nel cookie è ancora "attuale", cioè corrispondente a quello che si trova nel database. Nel mio esempio, questa operazione di verifica verrà fatta al massimo una volta ogni 60 secondi, così che la verifica non debba essere fatta ad ogni richiesta dell'utente. Ma se tu vuoi che sia fatta più di frequente, usa TimeSpan.FromSeconds(1) o altro valore che preferisci.
  • Quando l'utente fa il login, rinnovi il suo security stamp così da invalidare ogni altro cookie di autenticazione emesso in precedenza (per quei vecchi cookie la verifica del security stamp fallirà). Metti qualcosa del genere nell'action di login che riceve i dati dal form.

    var user = await userManager.FindByNameAsync(usernameRicevutoDalForm);
    if (user != null)
    {
    var result = await signInManager.CheckPasswordSignInAsync(user, passwordRicevutaDalForm, false);
    if (result.Succeeded)
    {
    await userManager.UpdateSecurityStampAsync(user);
    result = await signInManager.PasswordSignInAsync(user, passwordRicevutaDalForm, ricordamiRicevutoDalForm, false);
    if (result.Succeeded)
    {
    /*TODO: login avvenuto con successo, reindirizza all'area riservata*/
    }
    }
    }


ciao,
Moreno
Modificato da BrightSoul il 05 settembre 2019 20:32 -

Enjoy learning and just keep making
64 messaggi dal 08 giugno 2010
Perfetto!
Grazie ancora Moreno, sempre molto disponibile.

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.