Domanda

Ho dovuto creare un provider di appartenenze personalizzato per il mio attuale progetto ASP .Net in modo da adattarsi con il nostro schema del database, e sto avendo problemi configurandolo in blocco un utente se ottengono la loro password errato per tre volte, come è supportato dai provider standard.

E 'questo qualcosa che ho bisogno di implementare me stesso, o dovrebbe essere sostenuto intrinsecamente?

Non ho il codice che si occupa specificamente con esso (e nessuno dei membri dell'interfaccia sembrano affrontare in modo specifico), ma se ho bisogno di implementare io stesso, come posso fare per informare l'utente che sono bloccati? Ho bisogno di raccogliere una sorta di eccezione nel ValidateUser?

Soluzione

Peccato che non riesco a segnare due risposte, i link forniti da Dave R danno una grande sguardo in profondità a come funziona l'adesione, e quello che Zhaph sottolineato era proprio quello che ho finito per fare, la gestione della logica bloccato in costume provider di appartenenza.

Ho poi gestito la condizione di errore utilizzando evento loginError del controllo Login e registrati lì per vedere se l'utente è stato bloccato al fine di mostrare il messaggio di errore appropriato.

È stato utile?

Soluzione

Scott Mitchell ha scritto un eccellente serie di tutorial sul sito ASP.NET. Questo collegamento include informazioni sulla creazione di un provider personalizzato e discute la logica di chiusura:

http://www.asp.net/LEARN/security/ tutorial-06-cs.aspx

C'è anche alcun metodo in-built di sbloccare gli account (cioè quello che dovete fare questo attraverso strumenti di database se si sta utilizzando qualcosa di simile alla SqlMembershipProvider). Scott ha anche scritto un articolo sulla creazione di un interfaccia utente per gestire questo, che potete trovare qui:

http://www.asp.net/LEARN/security/ tutorial-14-vb.aspx

Io in realtà consiglio di leggere l'intera serie. di Scott un ottimo comunicatore.

Spero che questo aiuta.

Altri suggerimenti

Questo è qualcosa che dovreste scrivere voi stessi.

Lo schema del database predefinito ha le seguenti colonne della tabella aspnet_Membership:

IsLockedOut
FailedPasswordAttemptCount
FailedPasswordAttemptWindowStart

Il conteggio tentativo sarà incrementato ad ogni tentativo fallito all'interno della finestra tentativo, e il tempo del primo tentativo fallito è archiviato nella finestra di inizio di colonna, una volta FailedPasswordAttemptCount uguale i maxInvalidPasswordAttempts dalla configurazione, l'IsLockedOut è impostato.

Come Michiel afferma, il metodo di ValidateUser sarà quindi bisogno di controllare questi valori in base alle impostazioni nella configurazione del provider - di default sono:

maxInvalidPasswordAttempts="5"
passwordAttemptWindow="10"

Una volta che l'utente ha avuto i tentativi di accesso massimo, sarà necessario assicurarsi di aver impostato il MembershipUser.IsLockedOut è impostato dal provider - si può quindi verificare che il valore e comportarsi in modo appropriato - se si utilizza l'accesso predefinito controlli, questo valore sarà probabilmente già essere controllati per voi.

replicare le condizioni che portano in blocco (troppi tentativi di accesso cattivi). Poiché i provider di appartenenze fare un viaggio a loro back-end ogni volta, è ragionevole limitare questo approccio per i fornitori con un numero ragionevole di MaxInvalidPasswordAttempts.

if (0 < Membership.MaxInvalidPasswordAttempts && Membership.MaxInvalidPasswordAttempts < 100)
       {
                for(int i = 0; i <= Membership.MaxInvalidPasswordAttempts; i++)
                {
                    Membership.ValidateUser(userName, "jfdlsjflksjlkfjsdlkfjsdl");
                }
        }

Nel vostro provider di appartenenze personalizzato, è necessario implementare la funzione ValidateUser. Lì non solo controllare se il nome utente e la password sono validi, ma anche recuperare il numero di tentativi password validi ecc dal vostro archivio dati. Se il nome utente / password è valida, azzerare il conteggio tentativo password otherelse aumentare il numero di tentativo. Lo SqlMembershipProvider memorizza anche il datetime LastAttempt, quindi non è possibile bruteforzare modo in quanto non v'è permesso di tentare entro un determinato periodo di tempo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top