Мы используем Microsoft.Owin.Security.Cookies.CookieAuthenticationProvider
в веб-приложении ASP.Net MVC.
Код входа использует пользовательский класс, который отслеживает информацию об авторизации (userRights
в приведенном ниже примере). Код выглядит следующим образом:
string auth = JsonConvert.SerializeObject(userRights);
ClaimsIdentity identity = new ClaimsIdentity(new[]
{
new Claim(ClaimTypes.AuthorizationDecision, auth),
}, DefaultAuthenticationTypes.ApplicationCookie);
AuthenticationManager.SignIn(identity);
Меня беспокоит то, что эта информация может храниться в файле cookie аутентификации и отправляться клиенту, где ею потенциально можно манипулировать или изменить.
Исходный код прекрасно скрывает происходящее. В VisualStudio «Перейти к реализации» говорится, что он не может найти реализацию IAuthenticationManager.SignIn
, а исходный код Microsoft.Owin.Security.Cookies.CookieAuthenticationProvider
просто показывает набор делегатов Action
, которые я не могу отлаживать, поскольку у меня нет символов.
Другой проблемой являются атаки повторного воспроизведения файлов cookie. Я думаю о решении обеих потенциальных проблем с помощью хранилища сеансов следующим образом:
Session.Add("AuthorizationDecision", userRights);
и при выходе из системы:
Session.Clear();
Session.Abandon();
AuthenticationManager.SignOut();
Таким образом, я могу быть уверен, что информация не идет к клиенту и не может там манипулировать. Но я могу что-то упустить или мое первоначальное беспокойство может быть беспочвенным (что я не могу проверить из-за неясного кода). Наша команда обеспокоена тем, что «сессия не предназначена для авторизации и может быть не зашифрована или не так безопасна, как использование претензий». Было бы здорово, если бы вы, эксперты, поделились своими мыслями или развеяли мою озабоченность, объяснив, где хранятся претензии.
-- РЕДАКТИРОВАТЬ --
Я пошел дальше и удалил авторизацию из требований аутентификации (поскольку, похоже, никто не знает, где хранится информация). Он может быть кэширован в сеансе, но у сеанса есть полностью независимый срок жизни по сравнению с файлом cookie, поэтому требуется проверка на нуль, а также необходима проверка ClaimsIdentity.IsAuthenticated
, когда сеанс не является нулевым.