2016-06-28 60 views
5

ASP.Net Core dispone di SignInManager che gestisce l'autenticazione dell'utente. Uno dei metodi è PasswordSignInAsync(string username, string password, bool isPersistent, bool lockoutOnFailure). L'impostazione lockoutOnFailure su true dovrebbe bloccare temporaneamente l'utente dopo un certo numero di tentativi di accesso non riusciti.Blocco ASP.Net Core SignInManagerOnFailure

Guardando la tabella AspNetUsers nel database vedo il seguente:

  • aumento AccessFailedCount di 1 per ogni fallito l'accesso, quando colpisce 5 rotola oltre a 0.
  • Su ribaltamento a 0 LockoutTimeEnd è impostato su 5 minuti nel futuro.
  • LockoutEnabled rimane comunque 0 anche dopo rollover, e l'utente può continuare il tentativo di login.

Sembra che la funzionalità destinato è quello di consentire 5 tentativi di accesso, quindi bloccare il conto per 5 minuti.

Quindi le mie domande sono sono:

  1. Come faccio a impostare il numero di accessi non riusciti consentiti?
  2. Come si imposta il periodo di blocco?
  3. Perché il blocco non si attiva?
+0

sul tuo 3 ° bulletto, funziona per modello di progetto predefinito, quindi devi condividere del codice, per aiuto – tmg

+0

ho scoperto questo. Qualsiasi utente con "LockoutEnabled = false" non verrà mai bloccato a prescindere da "LockoutTimeEnd". Mentre l'utente con "LockoutEnabled = true" verrà bloccato solo se LockoutTimeEnd> DateTime.Now. Ho impostato tutti gli utenti su "LockoutEnabled = false", disattivando in modo efficace l'intero meccanismo di blocco. –

+1

Come l'hai impostato? quando si crea un utente nell'azione di registrazione? – tmg

risposta

7
  1. Come faccio a impostare il numero di accessi non riusciti consentiti?
  2. Come si imposta il periodo di blocco?

modello di progetto predefinito utilizza un metodo di estensione per la configurazione di servizi di identità AddIdentity<TUser, TRole> (in Startup classe ConfigureServices metodo). C'è un sovraccarico di questo metodo che è possibile configurare IdentityOptions.

Invece di

services.AddIdentity<ApplicationUser, IdentityRole>() 
    .AddEntityFrameworkStores<ApplicationDbContext>() 
    .AddDefaultTokenProviders(); 

È possibile utilizzare

var lockoutOptions = new LockoutOptions() 
{ 
    AllowedForNewUsers = true, 
    DefaultLockoutTimeSpan = TimeSpan.FromMinutes(5), 
    MaxFailedAccessAttempts = 5 
}; 

services.AddIdentity<ApplicationUser, IdentityRole>(options => 
    { 
     options.Lockout = lockoutOptions; 
    }) 
    .AddEntityFrameworkStores<ApplicationDbContext>() 
    .AddDefaultTokenProviders(); 

Quanto sopra è pointeless perché questi sono i valori di default di LockoutOptions, ma è possibile modifiche come ti piace.