2014-03-27 3 views
7

Wir arbeiten an einem OWIN MVC5-Projekt. Wir verwenden eine eigene Implementierung von IUserStore<T>, um die Benutzerverwaltung zu integrieren, die Teil unseres Firmenframeworks ist. Bis jetzt funktioniert das gut. Wir möchten Rollenmitgliedschaft und andere Sicherheitskonfiguration durch Ansprüche bereitstellen. Ich habe gesehen (und schnell getestet) die Möglichkeiten, entweder IUserClaimStore<T> zu implementieren oder ClaimsIdentityFactory an den UserManager anzuhängen. In beiden Szenarien sehe ich das Problem, dass die Ansprüche im Cookie des Benutzers gespeichert werden und wenn sich eine Rolle oder ein anderer Anspruch hinter der Web-App (über eine andere Anwendung, die direkt auf den Speicher der Benutzerverwaltung zugreift), die Benutzer ändert Cookie enthält die alten Ansprüche und der Benutzer hat zu viel oder zu wenig Berechtigungen, als sie hätte. Eine Möglichkeit, die mir in den Sinn kam, ist es, bei jeder Anfrage oder bei Anfragen in einem Zeitintervall zu prüfen, ob die Backend-Konfiguration der Benutzeransprüche geändert wurde, und wenn ja, den Cookie des Benutzers zu aktualisieren.So halten Sie die Cookie-Ansprüche, die mit MCV5/OWIN aktualisiert wurden

Ist dies der richtige Ansatz oder spart MVC5/Owin einen eleganteren/effizienteren Weg, um diese Anforderung zu erfüllen. Wenn es der richtige und einzige Ansatz ist, wo wäre der effizienteste Ort, um die Cookie-Informationen zu überprüfen und zu aktualisieren?

Antwort

7

Wir haben diese Funktion zu 2.0 hinzugefügt. Hier erfahren Sie, wie Sie die CookieMiddleware so konfigurieren, dass sie alle 30 Minuten neue Ansprüche erfasst (regenerateIdentity sollte den Code aufrufen, den Sie zum Generieren der ClaimsIdentity für Benutzer verwenden, wenn sie sich anmelden, und validiereInterval-Steuerelemente) oft wird regenerateIdentity genannt, aber nur, wenn die alte Cookie ist noch gültig)

 app.UseCookieAuthentication(new CookieAuthenticationOptions { 
      AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, 
      LoginPath = new PathString("/Account/Login"), 
      Provider = new CookieAuthenticationProvider { 
       OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
        validateInterval: TimeSpan.FromMinutes(30), 
        regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager)) 
      } 
     }); 
2

Nein, dies ist im Wesentlichen das, was Sie tun müssten, wenn Sie die Anforderung haben, dass der Cookie immer zu 100% aktuell ist.

Die Katana-Cookie-Middleware-Optionsklasse hat einen OnValidateIdentity-Callback für jedes Mal, wenn der Cookie angezeigt wird - Sie können dort einchecken und den Cookie erneut ausgeben. Auf diese Weise arbeiten die ASP.NET Identity 2.0-Bit zum Ablauf eines Cookies, wenn das Passwort eines Benutzers seit der Ausgabe des Cookies geändert wurde.

0

eine weitere Option könnte sein, SignalR in einem Design zu verwenden, wo in Benutzer-Browser angemeldet sind darauf gerichtet, das Cookie über einen Ajax-Aufruf neu zu erfassen.

Verwandte Themen