Что именно делает Owin помнить, что делает Браузер?

В нескольких местах в стандартной реализации ASP.Net MVC Identity 2.0 Owin вы увидите memoryBrowser, например:

await signInManager.SignInAsync(user, isPersistent: isPersistent, rememberBrowser: false);

Если вы установите для параметра rememberBrowser значение true, я заметил, что могу убить браузер, убить IIS Express, удалить пользователя, в который был занесен браузер, даже перезагрузить мою машину, и браузер по-прежнему обрабатывается как зарегистрированный, в. Не так уж и важно, учитывая, что удаленный пользователь, получивший авторизацию/вход в систему, будет вызывать всевозможные проблемы в коде за атрибутом [Authorize], который ожидает, что у него будет действительный пользователь.

Так что же это такое, что помнит Browser, и есть ли риск, что кто-то может просто подделать rememberBrowser в своих файлах cookie, чтобы обойти вход OWIN? Кажется, что точка [Authorize] заключается в том, чтобы гарантировать, что никто, кроме зарегистрированных пользователей, не получит доступ к данному действию контроллера, и помните, что Browser кажется дырой в этой гарантии.

Бонусный вопрос: есть ли способ отключить memoryBrowser, чтобы даже если подделанный куки файл действительно пришел, он был бы отклонен?

Ответы

Ответ 1

Ответ от @Hezye верен, но я подробнее расскажу об этом.

Вот код, который создает идентификатор для "rememberBrowser" CreateTwoFactorRememberBrowserIdentity (https://aspnetidentity.codeplex.com/SourceControl/latest#src/Microsoft.AspNet.Identity.Owin/Extensions/AuthenticationManagerExtensions.cs строка 215):

public static ClaimsIdentity CreateTwoFactorRememberBrowserIdentity(this IAuthenticationManager manager,
    string userId)
{
    if (manager == null)
    {
        throw new ArgumentNullException("manager");
    }
    var rememberBrowserIdentity = new ClaimsIdentity(DefaultAuthenticationTypes.TwoFactorRememberBrowserCookie);
    rememberBrowserIdentity.AddClaim(new Claim(ClaimTypes.NameIdentifier, userId));
    return rememberBrowserIdentity;
}

Итак, это идентичность с типом "TwoFactorRememberBrowserCookie" и только с запросом на идентификатор пользователя.

Глядя на исходный код SignInManager, который использует этот код: (https://aspnetidentity.codeplex.com/SourceControl/latest#src/Microsoft.AspNet.Identity.Owin/SignInManager.cs строка 106):

if (rememberBrowser)
{
    var rememberBrowserIdentity = AuthenticationManager.CreateTwoFactorRememberBrowserIdentity(ConvertIdToString(user.Id));
    AuthenticationManager.SignIn(new AuthenticationProperties { IsPersistent = isPersistent }, userIdentity, rememberBrowserIdentity);
}

Здесь IAuthenticationManager используется для входа 2 идентификатора: один для фактического пользователя, другой для "rememberBrowser". И я считаю, что это приведет к созданию двух файлов cookie - одного файла cookie для проверки подлинности пользователя, а другой - для браузера.

В SignInManager при использовании SignInOrTwoFactor код (строка 218) проверяет, установлен ли идентификатор "RememberBrowser" в файлах cookie.

Файлы cookie OWIN защищены шифрованием, шифрование заимствовано из DpapiDataProtector (документации). Я не специалист в криптографии, поэтому не могу прокомментировать силу криптографии. Я просто говорю, что cookie "rememberBrowser" зашифрован так же, как и основной файл cookie.

Что касается вашего упражнения, когда вы перезапустили свой IIS, машину и т.д. Удалили ли вы куки из браузера? Потому что, если вы этого не сделали, Identity (или скорее OWIN) будет рассматривать браузер как зарегистрированный, даже если исходная запись пользователя удаляется из базы данных. Хотя пользователь не будет входить в систему надолго, так как есть код в шаблоне MVC по умолчанию, который проверяет с базой данных для записи пользователя и выходит из системы, если пользовательская запись была изменена.

Что касается отключения "rememberBrowser" - всегда передайте false этому аргументу. И второй файл cookie не будет установлен.

Ответ 2

Я думаю, что помните, что Browser имеет отношение только к двухфакторной аутентификации. Поэтому, если вы установите значение true, браузер приобретет cookie TwoFactorRememberBrowser, который позволит пользователю пропускать аутентификацию 2FA (если она включена) во время процесса входа в систему.

Есть ли способ отключить memoryBrowser, чтобы даже если подделанный cookie действительно пришел, он был бы отклонен?

Файл cookie, созданный с помощью функции rememberBrowser, используется вместе с файлом cookie аутентификации. Это позволит пользователю пропускать 2FA, поэтому бесполезно без предварительной аутентификации.