Помощь - Безопасность сертификатов MVC - PullRequest
0 голосов
/ 23 марта 2011

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

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

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

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

1 Ответ

0 голосов
/ 23 марта 2011

Или

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

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

или

  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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...