Co to jest interfejs IUserSecurityStampStore <TUser> platformy ASP.NET Identity?

178

Patrząc na ASP.NET Identity (nowa implementacja członkostwa w ASP.NET), natknąłem się na ten interfejs podczas wdrażania własnego 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);
    }
}

IUserSecurityStampStorejest implementowana domyślnie, EntityFramework.UserStore<TUser>która zasadniczo pobiera i ustawia TUser.SecurityStampwłaściwość.

Po kilku dalszych poszukiwaniach okazuje się, że a SecurityStampjest Guidnowo wygenerowanym w kluczowych punktach UserManager(na przykład przy zmianie haseł).

Naprawdę nie mogę odszyfrować nic poza tym, ponieważ badam ten kod w Reflektorze . Prawie wszystkie symbole i informacje asynchroniczne zostały zoptymalizowane.

Ponadto Google nie pomogło.

Pytania są następujące:

  • Co to jest SecurityStampw ASP.NET Identity i do czego służy?
  • Czy SecurityStampodgrywa jakąś rolę podczas tworzenia plików cookie uwierzytelniania?
  • Czy są jakieś konsekwencje dla bezpieczeństwa lub środki ostrożności, które należy w związku z tym podjąć? Na przykład nie wysyłaj tej wartości do klientów?

Aktualizacja (16.09.2014)

Kod źródłowy dostępny tutaj:

Brian Chavez
źródło
1
@TryingToImprove, nowy magazyn tożsamości i zależne oprogramowanie pośredniczące OWIN zostało zaprojektowane tak, aby można je było w dużym stopniu dostosowywać. Jak SimpleMembership, jest out-of-the-box realizacja wykorzystując najnowszą EF na SQL Express. Ale schemat, metoda kwerendy danych, źródło bazy danych, a nawet oprogramowanie pośrednie można dostosować do konkretnego projektu. Co więcej, implementacja wydana przez MS wciąż ewoluuje. Dlatego każdy stara się znaleźć konkretną definicję.
Dave Alperovich

Odpowiedzi:

224

Ma to reprezentować aktualny obraz poświadczeń użytkownika. Więc jeśli nic się nie zmieni, znaczek pozostanie taki sam. Ale jeśli hasło użytkownika zostanie zmienione lub login zostanie usunięty (odłącz swoje konto google / fb), znaczek się zmieni. Jest to potrzebne do takich rzeczy, jak automatyczne podpisywanie użytkowników / odrzucanie starych plików cookie, gdy to nastąpi, co jest funkcją, która pojawi się w wersji 2.0.

Tożsamość nie jest jeszcze open source, obecnie jest w przygotowaniu.

Edycja: zaktualizowano do wersji 2.0.0. Dlatego głównym celem SecurityStampjest umożliwienie wylogowania się wszędzie. Podstawowym pomysłem jest to, że za każdym razem, gdy coś związanego z bezpieczeństwem zostanie zmienione na użytkowniku, na przykład hasło, dobrym pomysłem jest automatyczne unieważnienie wszelkich istniejących plików cookie logowania, więc jeśli Twoje hasło / konto zostało wcześniej przejęte, osoba atakująca nie ma już dostępu.

W 2.0.0 dodaliśmy następującą konfigurację, aby podpiąć OnValidateIdentitymetodę w, CookieMiddlewareaby sprawdzić SecurityStampi odrzucać pliki cookie, gdy uległa zmianie. Automatycznie odświeża również roszczenia użytkownika z bazy danych za każdym razem, refreshIntervalgdy znaczek pozostaje niezmieniony (co zajmuje się takimi rzeczami, jak zmiana ról itp.)

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))
    }
});

Jeśli Twoja aplikacja chce bezpośrednio wywołać to zachowanie, może wywołać:

UserManager.UpdateSecurityStampAsync(userId);
Hao Kung
źródło
1
Co się stanie, jeśli migruję dane ze struktury tabeli MVC4? Czy mogę po prostu zostawić to pole puste? A może w jakiś sposób coś schrzani?
Dmytro Shevchenko
1
Możesz po prostu poprosić o zwrócenie identyfikatora lub czegoś stałego, aby skutecznie uniemożliwić operację. Prawdopodobnie zadziałaby również Null / „”.
Hao Kung,
2
Czy UserManager.UpdateSecurityStampAsync (userId) działa dla UseOAuthBearerTokens?
Rikard
7
Nie, obecnie nie ma to wpływu na OAuthBearerTokens.
Hao Kung
3
Obecnie UseCookieAuthenticationjest przestarzały . Udało mi się to skonfigurować za pomocą services.Configure<SecurityStampValidatorOptions>(o => o.ValidationInterval = TimeSpan.FromSeconds(10));.
riezebosch
11

UseCookieAuthentication jest obecnie przestarzała . Udało mi się to skonfigurować za pomocą

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

Przeniesiono z odpowiedzi na odpowiedź na żądanie .

riezebosch
źródło
3
Czy to działa, jeśli używam ASP.NET (nie Core)? Jestem zdezorientowany. Jeśli przejdę do repozytorium tożsamości ASP, powie, że jest to dla Asp.NET Core.
El Mac
5

Zauważyłem, że do weryfikacji tokena wymagany jest SecurityStamp.

Do repo: Ustaw SecurityStamp na null w bazie danych Wygeneruj token (działa poprawnie) Weryfikuj token (nie powiodło się)

KierenH
źródło
To musi być błąd. Nie ma sensu generowanie tokena, którego nie można zweryfikować.
William T. Mallard
Błąd polega na tym, że pozwala wygenerować token, gdy stempel bezpieczeństwa jest pusty. (imho GenerateEmailConfirmationToken powinien zakończyć się niepowodzeniem, jeśli nie ma znacznika bezpieczeństwa. Zobacz tę odpowiedź: stackoverflow.com/a/29926407/1058214 )
mendel