#asp.net #security #multi-tenant
Вопрос:
Мы создаем сайт с несколькими арендаторами в ASP.NET, и мы должны позволить каждому клиенту настроить свою собственную модель безопасности. Они должны уметь определять свои собственные роли и назначать пользователей на эти роли. Каков наилучший способ сделать это?
Существует множество простых примеров событий page_load, которые содержат такой код, как:
if (!user.InGroup("Admin")
Response.Redirect("/NoAccess.aspx");
Но это жестко кодирует группы и разрешения в коде. Как я могу сделать его настраиваемым пользователем?
Ответ №1:
Возможно, поместите настраиваемые роли в таблицу БД, где вы храните роли и клиента, а затем сообщения страниц в другой таблице, например:
Table "Role"
RoleId, TenantId, Role
Table "PagePermissions"
PageId, RoleId
Table "UserRoles"
UserId, RoleId
Затем при загрузке страницы проверьте, находится ли пользователь в идентификаторе роли, у которого есть разрешения для этой страницы, например:
Select PageId FROM
UserRoles UR INNER JOIN PagePermissions PP
ON UR.RoleId = PP.RoleID
WHERE UR.Userid = @UserId AND PP.PageID = @PageId
Если возвращенных строк нет, то откажите пользователю.
Комментарии:
1. Да, мое решение можно использовать только тогда, когда у каждого клиента есть своя собственная установка приложения. Возможно, я неправильно понял…
2. Ну, вы можете добавить идентификатор приложения в запрос, чтобы разделить его между клиентами…
Ответ №2:
Я бы создал систему конфигурации для веб-сайта, которая легко управляется в конфигурационных файлах. Где вы могли бы набрать членов и использовать их вот так.
foreach(var group in ThisPageConfiguration.AcceptedRoleNames)
if (user.IsInRole(group))
...
Затем каждый клиент может настроить свой сайт в своих файлах конфигурации… И все другие типы вещей, которые вы хотели бы настроить.