Was ist die IUserSecurityStampStore <TUser> -Schnittstelle von ASP.NET Identity?


176

Bei der Betrachtung von ASP.NET Identity (neue Implementierung der Mitgliedschaft in ASP.NET) bin ich bei der Implementierung meiner eigenen auf diese Schnittstelle gestoßen UserStore:

//Microsoft.AspNet.Identity.Core.dll

namespace Microsoft.AspNet.Identity
{ 
    public interface IUserSecurityStampStore<TUser> :
    {
        // Methods
        Task<string> GetSecurityStampAsync(TUser user);
        Task SetSecurityStampAsync(TUser user, string stamp);
    }
}

IUserSecurityStampStorewird standardmäßig implementiert, EntityFramework.UserStore<TUser>wodurch die TUser.SecurityStampEigenschaft im Wesentlichen abgerufen und festgelegt wird .

Nach einigem weiteren Graben scheint es, dass a ein SecurityStampist Guid, das an Schlüsselpunkten in neu generiert wird UserManager(z. B. Ändern von Passwörtern).

Ich kann darüber hinaus nicht wirklich viel entziffern, da ich diesen Code in Reflector untersuche . Fast alle Symbol- und Async-Informationen wurden optimiert.

Auch Google hat nicht viel geholfen.

Fragen sind:

  • Was ist eine SecurityStampin ASP.NET Identity und wofür wird sie verwendet?
  • Tut das SecurityStamp eine Rolle, wenn Authentifizierungscookies erstellt werden?
  • Gibt es Sicherheitsauswirkungen oder Vorsichtsmaßnahmen, die dabei getroffen werden müssen? Senden Sie diesen Wert beispielsweise nicht nachgeschaltet an Clients?

Update (16.09.2014)

Quellcode hier verfügbar:


1
@TryingToImprove, der neue Identity Store und die abhängige OWIN-Middleware, sind hochgradig anpassbar. Wie SimpleMembership gibt es eine out-of-the-box Implementierung den neuesten EF auf SQL Express nutzen. Das Schema, die Datenabfragemethode, die Datenbankquelle und sogar die Middleware können jedoch an Ihre spezifische Puprose angepasst werden. Darüber hinaus entwickelt sich die von MS veröffentlichte Implementierung selbst noch weiter. Deshalb bemüht sich jeder, eine bestimmte Definition zu finden.
Dave Alperovich

Antworten:


223

Dies soll den aktuellen Schnappschuss der Anmeldeinformationen Ihres Benutzers darstellen. Wenn sich also nichts ändert, bleibt der Stempel gleich. Wenn jedoch das Passwort des Benutzers geändert oder ein Login entfernt wird (Verknüpfung Ihres Google / FB-Kontos aufheben), ändert sich der Stempel. Dies ist beispielsweise erforderlich, um Benutzer automatisch zu signieren oder alte Cookies abzulehnen. Dies ist eine Funktion, die in Version 2.0 enthalten ist.

Identität ist noch nicht Open Source, sie befindet sich derzeit noch in der Pipeline.

Bearbeiten: Aktualisiert auf 2.0.0. Der Hauptzweck von SecurityStampist es also, das Abmelden überall zu ermöglichen. Die Grundidee ist, dass es eine gute Idee ist, vorhandene Anmelde-Cookies automatisch ungültig zu machen, wenn etwas sicherheitsrelevantes am Benutzer geändert wird, z. B. ein Kennwort. Wenn Ihr Kennwort / Konto zuvor kompromittiert wurde, hat der Angreifer keinen Zugriff mehr.

In 2.0.0 haben wir die folgende Konfiguration hinzugefügt, um die OnValidateIdentityMethode in die CookieMiddlewarezu verknüpfen SecurityStampund Cookies abzulehnen, wenn sie geändert wurden. Außerdem werden die Ansprüche des Benutzers aus der Datenbank automatisch aktualisiert, refreshIntervalwenn der Stempel unverändert bleibt (dies kümmert sich beispielsweise um Rollenwechsel usw.).

app.UseCookieAuthentication(new CookieAuthenticationOptions {
    AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
    LoginPath = new PathString("/Account/Login"),
    Provider = new CookieAuthenticationProvider {
        // Enables the application to validate the security stamp when the user logs in.
        // This is a security feature which is used when you change a password or add an external login to your account.  
        OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
            validateInterval: TimeSpan.FromMinutes(30),
            regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager))
    }
});

Wenn Ihre App dieses Verhalten explizit auslösen möchte, kann sie Folgendes aufrufen:

UserManager.UpdateSecurityStampAsync(userId);

1
Was passiert, wenn ich Daten aus der MVC4-Tabellenstruktur migriere? Kann ich das Feld einfach leer lassen? Oder wird es die Dinge irgendwie vermasseln?
Dmytro Shevchenko

1
Sie können einfach die ID oder eine Konstante zurückgeben lassen, um sie effektiv zu einem No-Op zu machen. Null / "" würde wahrscheinlich auch funktionieren.
Hao Kung

2
Funktioniert UserManager.UpdateSecurityStampAsync (userId) für UseOAuthBearerTokens?
Rikard

7
Nein, OAuthBearerTokens sind derzeit nicht betroffen.
Hao Kung

3
Das UseCookieAuthenticationist mittlerweile veraltet . Ich habe es geschafft, es mit zu konfigurieren services.Configure<SecurityStampValidatorOptions>(o => o.ValidationInterval = TimeSpan.FromSeconds(10));.
Riezebosch

10

Die UseCookieAuthentication ist mittlerweile veraltet . Ich habe es geschafft, es mit zu konfigurieren

services.Configure<SecurityStampValidatorOptions>(o => 
    o.ValidationInterval = TimeSpan.FromSeconds(10));

Von Antwort zu Antwort pro Anfrage verschoben .


3
Funktioniert dies, wenn ich ASP.NET (nicht Core) verwende? Ich bin verwirrt. Wenn ich zum Asp Identity Repo gehe , heißt es, dass es für Asp.NET Core ist.
El Mac

5

Ich habe festgestellt, dass der SecurityStamp für die Token-Überprüfung erforderlich ist.

So repo: Setzen Sie SecurityStamp in der Datenbank auf null. Generieren Sie ein Token (funktioniert in Ordnung). Überprüfen Sie das Token (schlägt fehl.)


Das muss ein Fehler sein. Es macht keinen Sinn, ein Token zu generieren, das nicht überprüft werden kann.
William T. Mallard

Der Fehler besteht darin, dass Sie ein Token generieren können, wenn der Sicherheitsstempel leer ist. (imho GenerateEmailConfirmationToken sollte fehlschlagen, wenn es keinen Sicherheitsstempel gibt. Siehe diese Antwort: stackoverflow.com/a/29926407/1058214 )
Mendel
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.