Как реализовать шаблон безопасности Tenant View Filter в общей базе данных с использованием ASP.NET MVC2 и MS SQL Server - PullRequest
3 голосов
/ 25 августа 2010

Я начинаю создавать бизнес-приложения SaaS в ASP.NET MVC2, но перед тем, как начать, я хочу создать хорошую основу архитектуры.

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

Чтобы обеспечить хорошую изоляцию данных между арендаторами, я хотел бы реализовать шаблон безопасности Tenant View Filter (см. здесь ). Для этого мое приложение должно выдавать себя за других арендаторов (логины БД) в зависимости от пользователя, который входит в приложение. Процесс входа в систему должен быть как можно более простым (это не будет программное обеспечение корпоративного класса), поэтому клиент должен только ввести свое имя пользователя и пароль.

Пользователи будут получать доступ к своим данным через свой собственный субдомен (используя маршрутизацию субдоменов), например http://tenant1.myapp.com или http://tenant2.myapp.com

Каков наилучший способ удовлетворить этот сценарий?

Ответы [ 2 ]

5 голосов
/ 18 ноября 2010

Я бы также предложил использовать две базы данных, ConfigDB и ContentDB.

ConfigDB содержит таблицу арендаторов и имя хоста, имя базы данных, имя пользователя sql и пароль sql базы данных контента для каждого из арендаторов в этой таблице; доступ к нему осуществляется через отдельного пользователя sql с именем usrAdmin

ContentDB содержит все таблицы приложений, сегментированные по SID (или SUSER_ID) пользователя и доступ к которому получают каждый пользователь sql арендаторов с именами usrTenantA, usrTenantB, usrTenantC и т. Д.

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

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

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

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

Вы также можете разместить все свои обычные серверы.клиенты на серверах A и B, но у сервера C могут быть арендаторы в их собственных БАЗАХ ИНДИВИДУАЛЬНЫХ, весь код для нескольких арендаторов все еще там, но этим клиентам можно сказать, что они теперь более безопасны из-за более высокой изоляции.

0 голосов
/ 17 сентября 2010

Самый простой способ - это иметь таблицу Tenants, которая содержит поле URL, которое вы сопоставляете для всех проходящих запросов.

Если у арендатора может быть несколько URL, просто создайте дополнительную таблицу, такую ​​как TenantAlias, котораяподдерживает несколько URL-адресов для каждого арендатора.

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

Вы можете посмотреть на DotNetNuke.Это CMS с открытым исходным кодом, которая реализует эту точную модель.Я использую модель в нескольких наших приложениях, и она работает хорошо.

Кстати, для КАЖДОГО объекта в вашей системе вам понадобится столбец tenantid, полученный для приведенной выше таблицы.

...