2014-12-04 7 views
7

Ich habe eine DateTime hinzugefügt? LastLoggin-Eigenschaft für meine AppUser-Klasse. Ich möchte die Eigenschaft auf DateTime.Now setzen, wenn sich der Benutzer anmeldet. Loggen Sie sich mit der Login-Ansicht ein oder wenn Sie sich automatisch mit Cookies anmelden.MVC - Asp.Net Identität. HOWTO Log auf DB wenn Benutzer sich anmeldet

Wo ist der Ort, um den Login tatsächlich zu erfassen? Alle 'Best-Practices' würden geschätzt.

Antwort

11

Kommt drauf an. Wenn Sie Identität 2.1 verwenden, haben sie eine neue Klasse namens SignInManager eingeführt. Diese Klasse umschließt die OWIN AuthenticationManager-Klasse, die für die Unterzeichnung des Benutzers in tatsächlich verantwortlich ist. In asp.net 2.1, würden Sie einige Anmelde-Verfahren innerhalb SigninManager wie

  • PasswordSignInAsync()

  • sehen

    ExternalSignInAsync()

  • SignInAsync() und

  • TwoFactorSignInAsync().

Sobald die Benutzerinformationen aus der Datenbank abgerufen werden und die Kontrollen gemacht, all diese Methoden rufen AuthenticationManager.Signin(), um tatsächlich in die Benutzer unterschreiben. Dies wäre der perfekte Ort gewesen, aber dies ist ein Interface-Member von OWIN gesetzt, so dass Sie die Signin-Methode nicht überschreiben können. Also der beste Ort, um eine Benutzeranmeldung zu erfassen wäre die SigninManager.SigninAsync(...) Methode meiner bescheidenen Meinung nach. Dies liegt daran, wenn die Anmeldeinformationen gültig sind, und der Benutzer wird Locke nicht aus etc etc, ist alle Methoden, die ich oben erwähnt wie

  • PasswordSignInAsync()
  • ExternalSignInAsync()
  • TwoFactorSignInAsync()

Treffer SigninManager.SigninAsync(...). Da diese Methode virtuell ist, können Sie in Ihrer SigninManager Klasse außer Kraft setzen und

public override async Task SignInAsync(ApplicationUser user, bool isPersistent, bool rememberBrowser) 
    { 
     await base.SignInAsync(user, isPersistent, rememberBrowser); 
     user.LastLogin= DateTime.Now; 
     UserManager.Update(user); 
    } 

Hinweis wie dieser etwas tun, dass durch den Aufruf UserManager.Update(), werden Sie die Datenbank getroffen, aber ich sehe nicht, wie können Sie vermeide das. asp.net-Identitätsmethoden mögen es, die Datenbank zu treffen, und wenn Sie nicht ihre Implementierungen außer Kraft setzen, müssen Sie damit leben. (Verwenden von SigninManager.PasswordSignin() ohne Anpassung an die Basisklassen trifft die Datenbank 4 mal nach meinem SQL-Trace)

Wenn Sie nicht asp.net-Identität 2.1 verwenden, ist die SigninManager-Klasse nicht vorhanden. (MS hatte ein Beispiel-Nuget-Projekt, das eine ähnliche Hilfsklasse hatte, aber es war nicht Teil des Frameworks). Sie müssen die Methode in dieser Hilfsklasse finden und die Signin-Methode überschreiben (oder ändern).

Als letzte Anmerkung ist die Dokumentation für asp.net Identität nicht sehr vollständig in meiner bescheidenen Meinung und der Quellcode ist noch nicht öffentlich. Ich habe JetBrains DotPeek verwendet, um den Code innerhalb der Microsoft.AspNet.Identity.Owin Baugruppe und der SigninManager Klasse zu betrachten. Der Fluss, den ich dir gegenüber erwähnt habe (wie jede Methode irgendwie auf SigninAsync() trifft) ist meine Interpretation des Codes von DotPeek. Fühlen Sie sich frei zu überprüfen und stellen Sie sicher, dass ich nicht etwas verpasst habe. Viel Glück.

+3

Tolles Feedback! Ein Remarque UserManger.Update scheint nicht zu existieren, aber UpdateAsync tut es. Die letzte Zeile wurde: erwarten UserManager.UpdateAsync (Benutzer); – BrilBroeder

+0

Vielen Dank für diese Lösung, es funktionierte perfekt für das, was ich tun musste! – Quiver

Verwandte Themen