2014-12-25 16 views
7

Possiedo un'applicazione ASP.NET MVC 5 che utilizza ASP.NET Identity 2.0 per l'autenticazione dell'utente.Come mostrare captcha dopo N tentativi di accesso falliti?

Attualmente, gli utenti sono obbligati a inserire captcha ad ogni tentativo di accesso, ma provoca molti reclami sulla complessità dell'autenticazione.

L'obiettivo principale è creare un login umano il più semplice possibile e un robot il più complesso possibile.

Ho deciso di mostrare captcha dopo una certa quantità di tentativi di accesso non riusciti. Ci sono manyalreadyaskedquestions, ma non ho trovato risposte che mi aiutino a costruire una soluzione abbastanza completa. Ho trovato questo question sul tentativo di tracciamento non riuscito, ma utilizza anche il blocco, che non è quello che voglio. E secondo la risposta this parte della funzionalità necessaria è disponibile nel vecchio provider di Membership ASP.NET e non è disponibile (ancora?) Nell'identità ASP.NET.

Così, ho finito con il seguente algoritmo semplificato:

  1. Se paio di login e password fornita è corretta, allora il login utente in
  2. Se il login o password non corretta, quindi registrare tentativo di accesso fallito..
  3. Se registrato tre tentativi di accesso non riusciti per un utente, quindi visualizzare la pagina di accesso con captcha.
  4. Se il captcha immesso è valido, eseguire il conteggio dei tentativi di accesso non riusciti, quindi andare a 1.
  5. Se captcha immesso non è valido, visualizzare nuovamente la pagina di accesso con captcha.

La domanda è: come è possibile separare le richieste in entrata come richiesta per un accesso specifico?

Non posso fare affidamento su cookie, sessioni, IP, ecc. Perché qualsiasi robot può modificarli. E non posso fare affidamento sul login, perché l'accesso potrebbe non esistere completamente. L'approccio ovvio consiste nel creare una tabella separata che memorizzerà l'accesso, il conteggio dei tentativi falliti e un timestamp, ma il robot può facilmente riempirlo con account di accesso falsi, anche se posso ovviare a ciò eliminando le voci vecchie in un processo pianificato.

È una soluzione valida? C'è un modo migliore per farlo?

risposta

4

L'identità framework ha un conteggio per accessi non riusciti per utente. Puoi aumentarlo tramite await UserManager.AccessFailedAsync(userId). E la proprietà ApplicationUser.AccessFailedCount memorizza i conteggi non riusciti per il record utente. E per ripristinare il conteggio fallito chiama await UserManager.ResetAccessFailedCountAsync(userId)
Quindi questo può essere sfruttato.

Tuttavia ciò non vale per i nomi utente non validi: tentativi di accesso in cui l'utente non esiste nel database. In questo caso è possibile utilizzare la tabella proposta con l'eliminazione regolare dei record tramite cron-task.

Ma se l'utente tenta di accedere e inserisce diversi nomi utente su ogni tentativo, questo approccio fallirà. Quindi lancerò comunque un cookie in ogni caso, ma non fare affidamento su di esso pesantemente, sapendo che può essere ucciso facilmente.

Un'altra soluzione è usare il nuovo Google reCaptcha - su ogni pagina. Tuttavia questa è una nuova tecnologia e there are reports non è completamente affidabile.

+0

Sì, ho visto un nuovo recaptcha, ma non ero sicuro di come funzioni questa nuova cosa. Comunque, grazie per il suggerimento sui metodi 'UserManager'! Proverò a combinare 'AccessFailedAsync' e una tabella personalizzata per i login non esistenti e accetterò la tua risposta quando sistemerai una soluzione praticabile. – sigurd

Problemi correlati