Настраиваемая пользователем безопасность в многоквартирных домах ASP.NET веб-сайт

#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))
...
 

Затем каждый клиент может настроить свой сайт в своих файлах конфигурации… И все другие типы вещей, которые вы хотели бы настроить.