Справка - Безопасность сертификата MVC

У нас есть приложение MVC 2/Entity Framework, которое заменяет/переписывает существующую систему. Членство в ASP использовалось для обеспечения безопасности во время разработки, но теперь нам нужно заменить его, чтобы оно было совместимо с существующей инфраструктурой безопасности клиентов, отчасти для того, чтобы старые и новые системы могли некоторое время работать параллельно, а также потому, что у них уже есть процесс и система для настройки клиентов, и мы пока не можем заменить это.

Существующая безопасность сосредоточена вокруг таблицы в базе данных, в которой хранится номер сертификата, сопоставленный с идентификатором клиента. Затем идентификатор клиента используется для фильтрации соответствующих данных, отправляемых обратно в пользовательский интерфейс.

Мой вопрос заключается в том, как наиболее эффективно перейти от номера сертификата к идентификатору клиента. Каждое действие контроллера MVC может получить номер сертификата из HTTPContext и выполнить поиск в таблице безопасности, чтобы получить идентификатор клиента, но это кажется неэффективным для каждого действия контроллера. Система может иметь 1000 одновременных пользователей. Мы думаем, что это должно работать аналогично членству в ASP.NET, где имя пользователя/пароль для входа создает токен безопасности, который затем помещается в файл cookie. Вместо этого у нас будет сертификат, заменяющий имя пользователя/пароль для входа в систему, но он все равно будет генерировать токен безопасности.

Проблема в том, что мы недостаточно знаем об этой системе, чтобы определить, как с ней работать, и даже если это лучший путь вперед. Если кто-нибудь может предложить какие-либо советы или указатели на то, как мы это реализуем, мы будем очень признательны.


person MarkB    schedule 23.03.2011    source источник


Ответы (1)


Либо

  1. добавьте его в сеанс пользователей, как только вы его найдете, чтобы он был доступен при входе в систему.

  2. добавьте его в билет аутентификации форм (убедитесь, что вы исправлены для уязвимости POET, иначе это может быть подделано)

or

  1. кэшируйте таблицу в памяти и выполняйте поиск по мере необходимости. это может быть «немного» менее эффективным, чем сеанс, если вы уже используете сеанс, потому что тогда вы будете блокировать две коллекции (обычное использование сеанса), и коллекция, в которой вы ее храните, должна быть синхронизирована.

Если вы решите сохранить эту информацию в заявке, вы можете создать объект CustomIdentity для хранения этого идентификатора клиента.

 /// <summary>
        /// Deserializes the forms auth cookie with our userid, companyid, etc.
        /// </summary>
        /// <param name="sender">
</param>
        /// <param name="e"></param>
        void Application_PostAuthenticateRequest(object sender, EventArgs e)
        {
            HttpCookie authCookie = HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName];
            if (authCookie != null)
            {
                string encTicket = authCookie.Value;
                if (!String.IsNullOrEmpty(encTicket))
                {
                    FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(encTicket);
                    CustomIdentity id = new CustomIdentity(ticket);
                    //Assign the roles. If they aren't available, get from the session.
                    //The problem is when we use this custom principal it seems our roles arent populated.

                    GenericPrincipal principal = new GenericPrincipal(id, new string[] { "User" });

                    HttpContext.Current.User = principal;
                }
            }
        }

После того, как каждый запрос аутентифицирован с помощью билета аутентификации форм, вы можете десериализовать эту информацию в объект Customer IIdentity, который затем можно прочитать в приложении через:

 int companyId = ((CustomIdentity)HttpContext.Current.User.Identity).CompanyId
person Adam Tuliper - MSFT    schedule 23.03.2011
comment
Отлично! Это работает так хорошо, как я мог надеяться, большое спасибо - person MarkB; 07.04.2011