ciao, ben arrivato! Vediamo se riesco ad aiutarti, sarebbe utile conoscere come funziona il tuo meccanismo di login. Ad esempio, se stai usando la FormsAuthentication.
Non c'è un'impostazione rapida che ti permetta di impedire i login simultanei, quindi dovrai implementarla tu.
In linea generale, quando l'utente fa il login, oltre al controllare la validità della sua username e password, vai anche controllare qual è la data in cui quell'utente è stato "visto" per l'ultima volta nel sito.
Se l'ultima visita è avvenuta meno di 20 minuti fa (o meglio, meno del tempo di scadenza per inattività), allora nega il login perché significa che quelle credenziali sono già in uso in un altro browser.
Se pensi che questa soluzione sia adatta al tuo caso, quel che dovresti fare è aggiungere del codice nel global.asax che ti aggiorni la data dell'ultima visita dell'utente che sta effettuando la richiesta.
Puoi scrivere questa informazione nel database, oppure nella cache di ASP.NET così l'accesso al dato sarebbe più rapido.
Dunque nel global.asax scrivi:
//LogRequest andrà in esecuzione dopo ogni richiesta gestita da ASP.NET
void Application_LogRequest(object sender, EventArgs e)
{
var username = ...; //qui il codice cambia in base a dove hai memorizzato lo username dell'utente corrente
if (!string.IsNullOrEmpty(username)){
HttpContext.Current.Cache[username] = DateTime.Now;
}
}
Ora usa la chiave cache nella pagina di login, per capire se l'utente che si sta loggando era già attivo negli ultimi minuti.
var timeoutInMinuti = 20; //qui dovresti usare il valore di Session.Timeout o comunque il tempo di validità del cookie di autenticazione
var dataOra = (DateTime) (Cache[username] ?? DateTime.MinValue);
if (dataOra.AddMinutes(timeoutInMinuti) >= DateTime.Now)
{
//nega il login
}
E' importante che l'utente che si è loggato per primo non perda il cookie che lo identifica. Infatti, sia che tu stia usando la Sessione che la FormsAuthentication, il browser dell'utente riceverà un cookie di riconoscimento. Se questo cookie viene distrutto, bisognerà attendere il raggiungimento del timeout affinché l'utente riesca a loggarsi di nuovo.
Il cookie può essere distrutto se non era stato creato come persistente (ovvero se non "sopravvive" al riavvio del browser), oppure se viene cancellato volontariamente dall'utente.
E' anche importante che il numero di minuti di timeout coincidano con quelli di validità del cookie.
Un'ottimizzazione che puoi fare è rimuovere la chiave cache nel momento in cui l'utente effettua il logout. Così ad altri sarà immediatamente concesso di riutilizzare le stesse credenziali.
//al logout rimuovo la chiave che porta il nome dell'utente
Cache.Remove(username);
ciao
Modificato da BrightSoul il 19 maggio 2013 17.44 -