2014-06-13 6 views
10

Letzte Nacht arbeitete ich an einem neuen Projekt mit FormsAuthentication und das Ticket wurde angepasst, um ein Sicherheitstoken zu enthalten. Wenn sich der Benutzer in einem Browser abmeldet, wird er in allen abgemeldet. Beim Betrachten der neuesten Iteration von ASP.net Identity sieht es so aus, als ob es bereits diese Funktionalität eingebaut hat.ASP.Net Identity 2.0 AccessFailedCount nicht inkrementieren

Ich habe eine neue Test-MVC 5-Webanwendung mit individuellen Konten erstellt. Registrierung und Authentifizierung funktionierten direkt aus der Box.

jedoch bemerkte ich, dass fehlgeschlagene Anmeldeversuche wurden nicht Inkrementieren des AccessFailedCount Feld in den AspNetUsers Tisch. Und da das nicht inkrementiert wurde, konnte ich so viele fehlgeschlagene Anmeldeversuche ausprobieren, wie ich wollte, ohne dass der Account gesperrt wurde.

Wie aktiviere ich die AccessFailedCount und Lockout-Funktionalität auf ASP.net Identity 2.0?

Antwort

15

Sie müssen manuell damit umgehen. Die Methode CheckPassword ruft die Methode PasswordHasher.VerifyHashedPassword zur Überprüfung des Kennworts auf, aktualisiert jedoch die Anzahl fehlgeschlagener Zugriffe nicht, wenn das angegebene Kennwort nicht mit dem vorhandenen übereinstimmt.

Hier ist ein Beispiel für ein Authentifizieren Methode, die Aussperrung unterstützt:

UserManager<User> userManager = new UserManager<User>(new UserStore()); 

if (userManager.SupportsUserLockout && userManager.IsLockedOut(userId)) 
    return; 

var user = userManager.FindById(userId); 
if (userManager.CheckPassword(user, password)) 
{ 
    if (userManager.SupportsUserLockout && userManager.GetAccessFailedCount(userId) > 0) 
    { 
     userManager.ResetAccessFailedCount(userId); 
    } 

    // Authenticate user 
} 
else 
{ 
    if (userManager.SupportsUserLockout && userManager.GetLockoutEnabled(userId)) 
    { 
     userManager.AccessFailed(userId); 
    } 
} 
+8

Danke, ich hatte gehofft, dass es kein manueller Prozess war. Bei all der verstreuten Konfiguration, undichten Abstraktionen und Dingen, die Sie manuell implementieren müssen, fällt es mir schwer, den Wert von ASP.net Identity über das alte FormsAuthentication System zu sehen (es sei denn, Sie verwenden die externen Authentifizierungsanbieter). – Sam

+5

SignInManager in Version 2.1 ist, was eine höhere PasswordSignIn API zur Verfügung stellt, die viel von der Komplexität von Lockout/Twofactor usw. verbirgt. –

+1

sicher genug, wie @HaoKung sagte, in v2.2.1, wo ich gerade ein neues Projekt gestartet habe, hat diese Zeile 'var result = erwarten SignInManager.PasswordSignInAsync (model.UserName, model.Password, model.RememberMe, shouldLockout: false);' nur die 'false' in' true' ändern, für diejenigen, die hier landen, wie ich und brauche das. – RoLYroLLs

6

Es gibt auch den PasswordSignInAsync, die ein „shouldLockout“ Argument akzeptiert. Wenn Sie dies auf "true" setzen, werden automatisch fehlgeschlagene Anmeldeversuche durchgeführt.

var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: true); 
+0

Es scheint immer noch, dass Sie ResetAccessFailedCountAsync() aufrufen müssen, wenn der Benutzer erfolgreich angemeldet ist. Keine Ahnung, warum dieser Code nicht in der Standardprojektvorlage ist. –