Solo un concorrente di accesso per utente Asp.net

è possibile consentire a un solo concorrente di accesso per utente Asp.Net applicazione web?

Sto lavorando su una applicazione web in cui si desidera assicurarsi che il sito web è disponibile un solo login per l’utente alla volta . Come verificare che la corrente di utente già registrato o meno .

suggerire un corretto metodo di login con la quale siamo in grado di gestire questo problema . Penso che si dovrebbe utilizzare sql server lo stato di sessione per gestire questo problema . che cosa suggerisce ?

Ho pensato che una soluzione per esso . non so se è corretto o meno . siamo in grado di fare qualcosa di simile :

  1. Quando l’utente effettua il login, quindi, inserire l’id di sessione nella colonna utente . (useremo sessione di database in modo che siamo in grado di ottenere tutti i dati relative alla sessione come isexpired expiredatetime ecc facilmente).
  2. Stesso quando l’utente tenta di accesso secondo tempo, poi, si provvederà a controllare che l’id di sessione colonna e controllare che la sessione è scaduta o non . se la sessione non è scaduta, non possiamo permettere all’utente di effettuare il login .
  3. Update user ID di sessione ogni volta quando l’utente effettua il logout .

Si prega di suggerire questo modo corretto o meno.

  • Che tipo di autenticazione stai usando? Moduli standard Auth o qualcosa di personalizzato?
  • abbiamo creato un form di login e fatti store procedure per verificare le credenziali di accesso utente . abbiamo fatto non utilizzati, le eventuali caratteristiche di adesione .
  • salvare un isLoggedIn proprietà e quando si autenticare rilancio per 1, quando il logout per 0, se la sessione termina, nel frattempo, è necessario reimpostare tutte, Membership utilizza LastLoginDate e si può giocare un po ‘ con esso.

 

5 Replies
  1. 9

    Si prega di fare riferimento a:

    Quando lo stesso ID utente tenta di accedere su più dispositivi, come faccio a terminare la sessione su un altro dispositivo?

    “Out of the box .NET non supporta questa. .NET consente simultaneo di log-in, come sono sicuro che siete a conoscenza.

    Ho avuto questa stessa esigenza esatta, e si avvicinò con una bella chiazza di petrolio soluzione, dimostrato nel link sopra. In sintesi, la mia esigenza era di avere solo un utente log-in accadendo in una sola volta. Se lo stesso ID utente ha cercato di accedere altrove, poi ha ucciso la sessione per il primo log-in modo da verificare registro esistente-sotto un altro ID di Sessione (questo ha permesso l’ID utente per accedere da più istanze del loro browser web sul proprio computer [stesso ID di Sessione], che è comune, ma non da un altro computer [diversi ID di Sessione] (forse a causa di qualcuno che ha rubato le loro credenziali, per esempio)). Attraverso la modifica del codice, probabilmente si potrebbe modificare il comportamento di questa – cioè, evitare che il secondo log-in e tentare invece di uccidere il primo log-in che è già attivo e in uso.

    Naturalmente, è possibile che non si adatta al 100% di cosa hai bisogno, quindi sentitevi liberi di modificare a proprio piacimento.

  2. 5

    È possibile creare una voce di cache per ogni utente e memorizzare i loro ID di sessione in esso. Sessione ID univoco per ogni sessione del browser. Nella tua pagina di login, è possibile creare cache voce quando correttamente accesso:

    if(Cache.ContainsKey["Login_" + username])
        //Handle "Another session exists" case here
    else
        Cache.Add("Login_" + username, this.Session.SessionID);

    (Codice digitato nella casella di testo, senza il controllo della sintassi. Si supponga di “pseudo-codice”.)

    Globale.asax è quindi possibile collegare in Session_End e scadenza voce della cache dell’utente. Vedere questo per il mondiale.asax eventi.

    if(Cache.ContainsKey["Login_" + username])
        Cache.Remove("Login_" + username);
    • Perché utilizzare Cache invece di Application? O semplicemente statico globale Dictionary.
    • Cache è gestita meglio e può essere fatto per essere sincronizzati con le web farm o più thread con bilanciamento del carico, etc. Gli altri (statico o applicazione) sono solo nel processo e non la garanzia di un oggetto singleton in quei casi. Ma, se il caso è di non richiedere che, è possibile utilizzare una statico dizionario o oggetto di applicazione.
    • La Cache è per la parte non distribuita, solo in server web, non in webfarm. cache Distribuita è per tutti webfarm.
    • Hai ragione. Stavo pensando di stato della Sessione. La cache non viene distribuito. Dovrei sapere. Ho usato memcached e altre soluzioni per ovviare a questa limitazione. 🙁 Sono un Klondike bar!
    • È possibile utilizzare una cache distribuita soluzione come memcached.org. Quindi nella mia risposta, sostituire tutto il riferimento a “Cache” con memcached. O in alternativa, come l’altra risposta, ha detto, è possibile utilizzare una tabella per gestire, ma occorre fare attenzione se si dispone di un elevato traffico sito web. Blocco/blocco potrebbe diventare un problema. Memcached o simili è probabilmente una migliore esecuzione di un modo per farlo, ma coinvolge più l’installazione. Klondike bar è un gelato trattare in USA. I loro spot mostra qualcuno che fa qualcosa di bello, e poi dice “Dare a quel ragazzo Klondike bar!”
  3. 2

    Si potrebbe aggiungere una colonna nella tabella utente che indica che un utente è attualmente connesso.

    Quando un utente tenta di accedere a controllare la bandiera, se è vero che gli utenti di account è già attualmente utilizzato) quindi non permettere che il nuovo utente per accedere, se il flag è falso utenti il permesso di accesso in quanto ci account non viene utilizzato da chiunque altro in questo momento.

    Essere consapevoli però che, a meno che la utilizza attivamente i log out, non si può sapere quando l’utente si sposta su qualcos’altro (va a diversi sito web o si chiude il browser, etc.) quindi è necessario impostare un qualche tipo di timeout di sessione che automaticamente la disconnessione dell’utente se non ci sono nuove richieste entro un periodo di tempo specificato.

    Questo significa che se un utente chiude il browser e si tenta di accedere a un dispositivo portatile per esempio, lui/lei sarà in grado di accedere fino a che non specificata di timeout della sessione scada, in modo da dare il timeout di un po ‘ di pensiero, come non si desidera che l’utente, per ottenere l’accesso a rapidamente (se lui/lei sta leggendo una pagina lunga, etc.) e non si desidera che gli utenti di essere in grado di accedere in un altro dispositivo per ore, se lui/lei ha dimenticato di fare il log out prima di lasciare la casa.

    • Penso che si potrebbe fare non vuole persistere di tali dati, ma di tenere in memoria (io lo uso statico globale dizionario). Si cura, mentre l’applicazione è in vita. Una volta che va via, non si cura di più, quindi non c’è bisogno di persistono. Anche l’immagine di un problema a tornare utente e correttamente non autorizzata record del database.
    • limitazioni: statico globale non lavorare in una web farm scenari. se le sessioni sono appiccicoso, un’altra sessione potrebbe essere avviato e se si “attacca” ad un altro server in azienda, sia sarebbe consentito. senza sessioni permanenti, globale statica non essere aggiornati su altri server. globale statica dovrebbero essere isolati dalle condizioni di gara, soprattutto se l’applicazione è soggetta a “di terra “afferrare” login picchi, dove una marea di utenti bisogno/desidera accedere contemporaneamente (es. biglietti per la registrazione inizia all’ora specificata)
  4. 1

    Le credenziali di accesso vengono memorizzati nel cookie, in modo per sapere se l’utente è connesso, è necessario tenere queste informazioni sul server, preferito in un database può essere solo il luogo comune tra i web giardino o in una web farm.

    Ciò che si può tenere, è su un tavolo, che il user A è connessi o meno, la bandiera che è uscito, forse ultima interazione con l’utente per avere un timeout, ecc…

    Quindi diciamo che l’Utente è registrato, quindi si apre una bandiera sul database per l’utente, che è ora il log in, e se si tenta di registrato di nuovo, è prendersi cura di lui.
    Per fare questo lavoro è necessario dire agli utenti di effettuare il log out, o per mantenere un time out, simile al tempo di credenziali.

  5. 1

    Se Si utilizza il sistema di identità questo link vi aiuterà come single user login su più dispositivi.
    Prevenire gli Accessi Multipli in Asp.Net Identità
    Ho provato funzionano bene nel mio Asp.net Progetto Mvc.

    • Mi sembra un buon lavoro, ma potrebbe essere un disastro se il sito presenta numerosi utenti che inoltrano richieste di frequente al server come server sarà verificare la SecurityStamp ogni volta che viene effettuata una richiesta.

Lascia un commento