Beim Betrachten von ASP.NET Identity (Implementierung einer neuen Mitgliedschaft in ASP.NET) stieß ich bei der Implementierung meines eigenen UserStore
auf diese Schnittstelle:
//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);
}
}
IUserSecurityStampStore
ist standardmäßig implementiert EntityFramework.UserStore<TUser>
was im Wesentlichen das TUser.SecurityStamp
Eigentum.
Nach einigen weiteren Grabungen scheint es, dass ein SecurityStamp
ein Guid
ist, das an Schlüsselpunkten im UserManager
neu generiert wird (zum Beispiel durch Ändern von Passwörtern).
Ich kann nicht wirklich viel darüber hinaus entziffern, da ich diesen Code in Reflector untersuche. Fast alle Symbol- und Async-Informationen wurden optimiert.
Auch Google hat nicht viel geholfen.
SecurityStamp
in ASP.NET Identity und wofür wird es verwendet?SecurityStamp
eine Rolle, wenn Authentifizierungscookies erstellt werden?Quellcode hier verfügbar:
Dies soll den aktuellen Schnappschuss der Anmeldeinformationen Ihres Benutzers darstellen. Wenn sich also nichts ändert, bleibt der Stempel unverändert. Wenn jedoch das Passwort des Nutzers 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, es ist noch in der Pipeline.
Bearbeiten: Aktualisiert für 2.0.0. Der Hauptzweck von SecurityStamp
besteht darin, das Abmelden überall zu ermöglichen. Die Grundidee ist, dass bei jeder Änderung von Sicherheitsaspekten am Benutzer, wie z. B. einem Passwort, automatisch alle vorhandenen Anmelde-Cookies ungültig gemacht werden. Wenn also Ihr Passwort/Konto zuvor kompromittiert wurde, hat der Angreifer keinen Zugriff mehr.
In 2.0.0 haben wir die folgende Konfiguration hinzugefügt, um die OnValidateIdentity
-Methode in die CookieMiddleware
einzuhängen, um die SecurityStamp
zu betrachten und Cookies abzulehnen, wenn sie geändert wurden. Außerdem werden die Ansprüche des Benutzers automatisch alle refreshInterval
aus der Datenbank aktualisiert, wenn der Stempel unverändert ist (dies erledigt Dinge wie 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);
Ich habe festgestellt, dass der SecurityStamp für die Token-Überprüfung erforderlich ist.
So wiederholen Sie den Vorgang: Setzen Sie SecurityStamp in den Datenbanken auf null. Generieren Sie ein Token (funktioniert in Ordnung). Überprüfen Sie das Token (schlägt fehl).