2014-08-28 6 views
9

Ich habe 2 zu, dass Fragen im Zusammenhang mit:Wie kann man .AspNet.ApplicationCookie nach dem Hinzufügen eines Benutzers zur Rolle mit Asp.Net Identity 2 entwerten?

1) I nach Hinzufügen/Entfernen einige Remote-Benutzer zu Rolle mit Asp.Net Identität 2. ich Verwendung UpdateSecurityStamp Versuchte invalidate.AspNet.ApplicationCookie benötigen, Da jedoch kein Passwort oder Benutzername geändert wurde, bleibt SecurityStamp gleich. Wenn ich ApplicationRoleManger benutze, kann ich sehen, dass Benutzerrollen aktualisiert werden, aber in User.Identity Claims bleiben sie unverändert.

2) Wie funktioniert .AspNet.ApplicationCookie Validierung und wie kann ich darauf zugreifen?

Ich habe versucht, diesen Code zu verwenden, aber ohne Wirkung

What is ASP.NET Identity's IUserSecurityStampStore<TUser> interface?

Update: Das ist mein Plätzchen Auth Einstellung ist:

app.UseCookieAuthentication(new CookieAuthenticationOptions 
     { 
      AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, 
      LoginPath = new PathString("/Account/Login"), 
      Provider = new CookieAuthenticationProvider 
      { 
       OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
        validateInterval: TimeSpan.FromSeconds(0), 
        regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager)), 
       OnApplyRedirect = ctx => 
       { 
        if (!IsApiRequest(ctx.Request)) 
        { 
         ctx.Response.Redirect(ctx.RedirectUri); 
        } 
       } 
      } 
     }); 

kann ich sehen, dass user.GenerateUserIdentityAsync (Manager) wird nur bei der Anmeldung angezeigt.

Antwort

8

Einstellung CookieAuthenticationOptions ist nicht genug. Wenn ich neues ASP.NET MVC-Projekt in VS erstellte, funktioniert alles gut und GenerateUserIdentityAsync() wird von jeder Anforderung (wenn validateInterval ist 0) festgelegt. Das einzige Problem war, dass man Kontext pro Anfrage registrieren:

app.CreatePerOwinContext(ApplicationDbContext.Create); 
app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create); 

Als ich Winsdor Castle bin mit Kontext pro Anfrage zu erstellen, ich diese Zeilen aus Vorlage gelöscht. In injected-Methode in ApplicationUserManager.Create ist UserTokenProvider festgelegt, die die Magic Perharps ausführt.

Nirgendwo in der Dokumentation ist irgendetwas darüber, aber schließlich löst es das Problem.

Wenn Sie eine eigene IoC verwenden, können Sie die Abhängigkeit dieser Art und Weise lösen

app.CreatePerOwinContext(() => IoCContainerManager.Container.Resolve<ApplicationDBContext>()); 
app.CreatePerOwinContext(() => IoCContainerManager.Container.Resolve<ApplicationUserManager>()); 

und Registertypen auf diese Weise (zB mit Schloss Winsdor.):

container.Register(Component.For<ApplicationDBContext>().LifestylePerWebRequest()); 
container.Register(Component.For<ApplicationUserManager>().LifestylePerWebRequest()); 
+1

Großer Fang! Ich habe es komplett vermisst. Schön, dass es für dich geklappt hat! – trailmax

5

Wenn Sie die Sicherheit Stempel zu ändern, um dies auf eine Rolle Verwendung nach Zugabe:

UserManager.UpdateSecurityStampAsync(User.Id) 

Und richten nicht validateInterval zu TimeSpan.FromSeconds(0) - dies im Grunde bedeutet, dass Datenbank jeden auf Anfrage getroffen werden. Stellen Sie es auf etwa 10 Minuten ein.

Nur letzte Nacht I've blogged about CookieAuthenticationProvider und wie es den Cookie ungültig macht. Grundsätzlich enthält das Cookie Informationen über die Zeit, zu der es erstellt wurde. Wenn es älter ist als validateInterval, dann erreiche die Datenbank, erhalte den Benutzerdatensatz und vergleiche die Sicherheitsstempel in Cookie und in der Datenbank. Wenn der Stempel nicht geändert wurde, geben Sie einen neuen Cookie mit neuem Ausgabedatum aus. Wenn die Stempel nicht übereinstimmen, machen Sie den Cookie ungültig und melden Sie sich ab.

+0

Vielen Dank für Ihre Blog-Link! Scheint, dass mir noch etwas fehlt, denn wie gesagt, die GenerateUserIdentityAsync Methode wird nur beim Login ausgelöst - also als OnValidateIdentity.Und Cookie bleibt gleich, auch wenn ich UpdateSecurityStampAsync (User.Id) aufruft. Übrigens habe ich null Zeitspanne nur zum Testen. Gibt es noch etwas, was fehlt mir in der Authentifizierungskonfiguration? –

+0

versuchen, alle Cookies zu töten und erneut einloggen – trailmax

+0

Ich habe es viele Male getan. Ist das nicht das Problem, dass SecurityStampValidator.OnValidateIdentity SecurityStamp und UserId überprüft - und sie bleiben gleich? Also wird keine Änderung festgestellt? –

Verwandte Themen