14 messaggi dal 02 novembre 2011
Buongiorno a tutti.
E' la prima volta che scrivo, premetto che non sono molto pratico, sono autodidatta e molto spesso mi avete salvato la vita con i vostri post e quindi davvero grazie se avrete la possibilita' di rispondermi.
Sto lavorando su un sito molto semplice con un'area riservata a cui accedono utenti ognuno con la sua credenziale.
Il sito e' nato in 3.5 ma ora utilizza un web.config 4.0 perche' avevo necessita' di pubblicare su Aruba con versione pipeline e inserire la stringa <modules runAllManagedModulesForAllRequests="true"> per impedire l'accesso diretto ai documenti pubblicati. (Ho seguito le istruzioni da un vostro post)
Il data base che gestisce l'area riservata e' un ASPNETMDB.mdb (nel caso, al momento, NON posso sostituirlo con ASPNETDB.sql o altro) che gestisce tutta la parte di login in automatico tramite lo strumento di amministrazione di aspnet.
Avrei necessita' di capire se e' possibile e, nel caso come fare, per impedire a 2 utenti di connettersi contemporaneamente con la stessa password. C'e' qualche controllo che posso intercettare? o impostazione che posso mettere?
Mi occorrerebbe anche la stringa di codice perche' da solo altrimenti dubito di essere in grado
grazie infinite
11.886 messaggi dal 09 febbraio 2002
Contributi
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 -

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.