Что такое интерфейс ASP.NET Identity IUserSecurityStampStore <TUser>?

Посмотрев на ASP.NET Identity (новая реализация членства в ASP.NET), я столкнулся с этим интерфейсом при реализации моего собственного 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);
    }
}

IUserSecurityStampStore реализуется по умолчанию EntityFramework.UserStore<TUser>, который по существу получает и устанавливает свойство TUser.SecurityStamp.

После некоторого дополнительного копания, кажется, что SecurityStamp - это Guid, который вновь создается в ключевых точках в UserManager (например, смена паролей).

Я не могу действительно расшифровать многое из этого, так как я рассматриваю этот код в Отражателе. Оптимизирован практически весь символ и асинхронная информация.

Кроме того, Google не очень помог.

Вопросы:

  • Что такое SecurityStamp в ASP.NET Identity и для чего он используется?
  • Выполняет ли роль SecurityStamp роль при создании файлов cookie для проверки подлинности?
  • Существуют ли какие-либо меры безопасности или меры предосторожности, которые необходимо предпринять с этим? Например, не отправляйте это значение вниз по течению клиентов?

Обновление (9/16/2014)

Исходный код доступен здесь:

Ответ 1

Предназначен для представления текущего моментального снимка ваших учетных данных пользователя. Поэтому, если ничего не изменится, штамп останется прежним. Но если пароль пользователя изменен или удаляется логин (отмените связь с учетной записью google/fb), штамп изменится. Это необходимо для таких вещей, как автоматическое подписание пользователей/отказ от старых файлов cookie, когда это происходит, что является функцией, которая приходит в 2.0.

Идентификация еще не является открытым исходным кодом, но она все еще находится в конвейере.

Изменить: Обновлено для 2.0.0. Таким образом, основная цель SecurityStamp - включить выключение везде. Основная идея заключается в том, что всякий раз, когда что-то связанное с безопасностью изменяется у пользователя, например пароль, рекомендуется автоматически аннулировать любой существующий знак в файлах cookie, поэтому, если ваш пароль/аккаунт был ранее взломан, у злоумышленника больше нет доступа.

В 2.0.0 мы добавили следующую конфигурацию, чтобы подключить метод OnValidateIdentity в CookieMiddleware, чтобы посмотреть на SecurityStamp и отклонить файлы cookie, когда они были изменены. Он также автоматически обновляет заявки пользователя из базы данных каждый refreshInterval, если штамп не изменяется (что касается таких вещей, как изменение ролей и т.д.)

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

Если ваше приложение хочет явно вызвать это поведение, оно может вызвать:

UserManager.UpdateSecurityStampAsync(userId);

Ответ 2

Я заметил, что SecurityStamp требуется для проверки токена.

Для репо: Установите SecurityStamp в null в databsae Создать токен (работает нормально) Проверить токен (сбой)