none
MVC4 SimpleMembership: Zusätzliche Informationen speichern

    Allgemeine Diskussion

  • Hallo,

    verwende SimpleMembership und möchte z. B. die Uhrzeit des letzten Login speichern:

            [HttpPost]
            [AllowAnonymous]
            [ValidateAntiForgeryToken]
            public ActionResult Login(LoginModel model, string returnUrl)
            {
                if (ModelState.IsValid && WebSecurity.Login(model.UserName, model.Password, persistCookie: model.RememberMe))
                {
                    // TODO: Funktioniert leider nicht :-(
                    UsersContext usersContext = new UsersContext();
    
                    User user = usersContext.Users.Find(WebSecurity.CurrentUserId); // Hier tritt der Fehler auf
                    user.LastLogIn = DateTime.Now;
                    usersContext.SaveChanges();
    
    
                    return RedirectToLocal(returnUrl);
                }
    
                // Wurde dieser Punkt erreicht, ist ein Fehler aufgetreten; Formular erneut anzeigen.
                ModelState.AddModelError("", "Der angegebene Benutzername oder das angegebene Kennwort ist ungültig.");
                return View(model);
            }
    


    Laut Debugger ist

    WebSecurity.CurrentUserID

    null, was ich deswegen nicht verstehe, da ja zuvor das Login (Websecurity.Login()) ausgeführt wird.

    Oder anders gefragt, was muss ich machen, damit ich mir die Uhrzeit des letzten Logins abspeichern kann?

    Vielen Dank

    KonFiDa

    Sonntag, 15. September 2013 13:43

Alle Antworten

  • Hallo,
    Versuche mal HttpContext, genauer
    (System.Web.HttpContext.Current.User).Identity.Name.ToString()
    
    Grüße Alexander


    Sonntag, 15. September 2013 20:21
  • Hallo Alexander,

    Danke für den Tipp, aber damit klappt es auch nicht.

    Mein Verdacht ist, dass der User noch gar nicht angemeldet ist, denn sowohl bei

    WebSecurity.Login(model.UserName, model.Password, persistCookie: model.RememberMe)

    als auch bei

    System.Web.HttpContext.Current.User.Identity.Name.ToString()

    gibt der Debugger für Authenticated = false, Name = "" aus.

    Daher frage ich mich, wo der User denn eigentlich genau angemeldet wird, denn als nächstes passiert ja der Redirect (also auf Homepage) und hier wird nach Request.IsAuthenticated der User.Name bereits ausgegeben (_LoginPartial).

    Irgendwie erschließt sich mir die Sache nicht ganz :-/

    KonFiDa

    Montag, 16. September 2013 07:32
  • Hallo,
    Nun den Membership Provider wirst Du schon implementieren müssen. Schau Dir folgenden Link an.

    http://blog.thomasbandt.de/39/1409/de/blog/der-eigene-custom-membershipprovider-in-10-minuten.html

    Die Implementierung steckt in MyMembershipprovider.cs Anpassungen in der Web.Config beachten. 

    Grüße Alexander

    Montag, 16. September 2013 08:09
  • Hallo Alexander,

    einen Membership Provider habe ich, wie in der Überschrift angegeben den SimpleMembership.

    Habe versucht, den Fehler methodisch zu finden:

                    if (!WebSecurity.Initialized)
                    {
                        WebSecurity.InitializeDatabaseConnection(
                            "DefaultConnection", "Users", "Id", "Account",
                            autoCreateTables: false);
                    }
    
                    
                    // Nächster Versuch
                    if (!WebSecurity.IsAuthenticated)
                    {
                        WebSecurity.Login(model.UserName, model.Password, persistCookie: model.RememberMe);
    
                        if (WebSecurity.IsAuthenticated)
                        {
                            UsersContext uc = new UsersContext();
                            User user = uc.Users.Where(x => x.Id == WebSecurity.CurrentUserId).FirstOrDefault();
    
                            ViewBag.Message = "Hallo " + user.FirstName +
                                " " + user.LastName + "!";
                        }
                    }
    

    Websecurity ist initialisiert. Nur authentifiziert ist der User nicht. Deswegen melde ich ihn (noch einmal) explizit an. Allerdings scheint es genau an dieser Anmeldung zu haken, denn

    WebSecurity.IsAuthenticated

    ist false;

    Es kann nicht an falschen Anmeldedaten leigen, denn wenn ich wieder auf der Startseite bin, sehe ich die Anmeldung des Benutzers, den ich nicht authentifizieren konnte.

    Ich verwende die Standardeinstellungen von SimpleMembership, außer das meine Datenbank/Tabelle etwas anders heißt, aber das kann man ja aus dem InitializeDatabaseConnection erkennen.

    Vielen Dank

    KonFiDa


    Montag, 16. September 2013 08:40
  • Durch Zufall bin ich auf diesen Artikel gestoßen, der erklärt, warum z. B. der User.Name null ist:

    http://stackoverflow.com/questions/12647942/websecurity-currentusername-and-user-identity-name-are-null-after-logging-in?rq=1

    Ok, jetzt weiß ich, dass es so sein sollte.

    Wie bekomme ich nun trotzdem die Zeit der Anmeldung in meine Datenbank?

    KonFiDa

    Montag, 16. September 2013 11:39
  • *****************************************************************************************************

    Dieser Thread wurde mangels weiterer Beteiligung ohne bestätigte Lösung abgeschlossen.

    Neue Rückfragen oder Ergänzungen zu diesem Thread bleiben weiterhin möglich.

    *****************************************************************************************************

    Ciprian Bogdan, MICROSOFT   Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-PrinzipEntwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.





    Montag, 24. März 2014 11:51