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


178

Переглядаючи ідентичність ASP.NET (нова реалізація членства в 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
@TryingToImprove, новий магазин ідентичності та залежне проміжне програмне забезпечення OWIN розроблений таким чином, що він легко налаштовується. Як і SimpleMembership, існує нестандартна реалізація, яка використовує найновіший EF на SQL Express. Але схема, метод запиту даних, джерело баз даних і навіть середній посуд налаштовуються навколо вашої конкретної зіниці. Більше того, реалізація, випущена MS, сама по собі все ще розвивається. Ось чому всі намагаються знайти конкретне визначення.
Дейв Альперович

Відповіді:


224

Це покликане представляти поточний знімок облікових даних вашого користувача. Тож якщо нічого не зміниться, штамп залишиться колишнім. Але якщо пароль користувача буде змінено, або логін буде видалено (від’єднайте ваш обліковий запис 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);

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

Перенесено з відповіді на відповідь на запит .


3
Чи працює це, якщо я використовую ASP.NET (не Core)? Я збентежений. Якщо я перейду до Asp Identity Repo, він скаже, що це для Asp.NET Core.
Ель Мак

5

Я помітив, що для підтвердження маркера потрібна марка SecurityStamp.

Для повторного введення: Встановіть SecurityStamp на нуль у databsae. Створіть маркер (працює нормально) Перевірте маркер (не вдається)


Це має бути помилка. Немає сенсу генерувати маркер, який неможливо перевірити.
Вільям Т. Маллард

Помилка полягає в тому, що вона дозволяє генерувати маркер, коли штамп безпеки порожній. (imho GenerateEmailConfirmationToken повинен вийти з ладу, якщо немає печати безпеки. Див. цю відповідь: stackoverflow.com/a/29926407/1058214 )
mendel
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.