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

178

Глядя на 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свойство.

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

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

Кроме того, Google не сильно помог.

Вопросы:

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

Обновление (16.09.2014)

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

Брайан Чавес
источник
1
@TiringToImprove, новый магазин Identity и зависимое промежуточное программное обеспечение OWIN разработано так, чтобы их можно было легко настроить. Как SimpleMembership, есть вне коробки реализации используя последнюю EF на SQL Express. Но схема, метод запроса данных, источник базы данных и даже промежуточное ПО настраиваются в зависимости от вашей конкретной куклы. Более того, реализация, выпущенная MS, сама все еще развивается. Вот почему все пытаются найти конкретное определение.
Дейв Альперович

Ответы:

224

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

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

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

В 2.0.0 мы добавили следующую конфигурацию, чтобы подключить OnValidateIdentityметод в, CookieMiddlewareчтобы посмотреть SecurityStampи отклонить куки, когда они изменились. Он также автоматически обновляет заявки пользователя из базы данных каждый раз, 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);
Хао Кунг
источник
1
Что если я перенесу данные из структуры таблицы MVC4? Могу ли я просто оставить это поле пустым? Или это все как-то испортит?
Дмитрий Шевченко
1
Вы можете просто сделать так, чтобы он возвращал идентификатор или что-то постоянное, чтобы эффективно сделать его неоперативным. Null / "", вероятно, также будет работать.
Хао Кунг
2
Работает ли UserManager.UpdateSecurityStampAsync (userId) для UseOAuthBearerTokens?
Рикард
7
Нет, OAuthBearerTokens в настоящее время не затрагиваются.
Хао Кунг
3
На данный момент UseCookieAuthenticationне рекомендуется . Мне удалось настроить его с помощью services.Configure<SecurityStampValidatorOptions>(o => o.ValidationInterval = TimeSpan.FromSeconds(10));.
riezebosch
11

UseCookieAuthentication уже устарела . Мне удалось настроить его с помощью

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

Перемещено из ответа в ответ на запрос .

riezebosch
источник
3
Это работает, если я использую ASP.NET (не Core)? Я смущен. Если я перейду к Asp Identity Repo, он скажет, что это для Asp.NET Core.
El Mac
5

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

Чтобы сделать репо: Установите для SecurityStamp значение null в области данных. Сгенерируйте токен (работает нормально). Проверьте токен (не работает)

KierenH
источник
Это должно быть ошибка. Нет смысла генерировать токен, который невозможно проверить.
Уильям Т. Маллард
Ошибка заключается в том, что он позволяет генерировать токен, когда отметка безопасности пуста. (imho GenerateEmailConfirmationToken должен завершиться сбоем, если нет
отметки