ASP.net roles and Projects

РЕДАКТИРОВАТЬ - Переписал мой оригинальный вопрос, чтобы дать немного больше информации

Справочная информация
На своей работе я работаю над веб-приложением ASP.Net для наших клиентов. В нашей реализации мы используем такие технологии, как проверка подлинности с помощью форм с MembershipProviders и RoleProviders. Все шло хорошо, пока я не столкнулся с некоторыми трудностями при настройке ролей, потому что роли не являются общесистемными, а связаны с учетными записями клиентов и проектами.

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

Какой клиент / проект?
Наша компания предоставляет управленческую информацию для наших клиентов на ежегодной (или иной временной основе) основе.
В наших системах заказчик / контракт состоит из:

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

Настройка сайта Extranet
В конечном итоге мы хотим, чтобы все клиенты имели доступ к их управленческой информации через нашу онлайн-систему. Экстранет состоит из двух сайтов:

Сайт компании: предоставляет обзор информации об учетной записи и продуктахМесто измерения: после выбора измерения, подробная информация о том периоде времени

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

Наше решение Visual Studio состоит из ряда проектов. Одно веб-приложение с именем Portal для основы. Сайты и модули - это виртуальные каталоги в этом приложении (упрощает совместное использование MasterPages).

Какие роли?
Следующие пользователи (читай: роли) будут использовать систему:

Администраторы: пользователи разработки :) (не связаны с клиентами, полный доступ)Сотрудники: сотрудники нашей компании (не связаны с клиентами, полный доступ)Customer SuperUser: менеджеры высшего уровня (полный доступ к своей учетной записи / измерения)Customer ContactPerson: основной контакт (полный доступ к их измерениям)Менеджер по работе с клиентами: менеджер отдела (ограниченный доступ, конкретные данные измерения)

А как насчет пользователей ASP.Net?
В системе будет много пользователей ASP.Net, давайте сосредоточимся на пользователях клиентов:

Пользователи не делятся между учетными записямиSuperUser X автоматически имеет доступ ко всем (и новым) измерениямПользователь Y может быть основным контактом для измерения 1, но не может играть роль для измерения 2Пользователь Y может быть основным контактом для измерения 1, но иметь роль менеджера для измерения 2Менеджеры отдела - это много отдельных пользователей (для каждого Измерения). Если бы Менеджер Z имел логин для Измерения 1, мы хотели бы использовать этот логин снова, если он участвует в Измерении 2.

Структура URL
Это типичные ссылки в нашем приложении:

HTTP: // хост / Логин - экран входаHTTP: // хост / проект - экран обзора счета / продукта (выбор измерения)HTTP: // хост / проект / 1000 - детали измерения (id: 1000)HTTP: // хост / проект / 1000 / планирование - обзор планирования (для основного контакта / суперпользователя)HTTP: // хост / проект / 1000 / отчеты - загрузка отчетов (менеджер отдела X может получить доступ только к отчету X)

Мы также создадим URL-адрес документа, по которому вы можете запросить конкретный документ по его GUID. Система должна будет проверить, есть ли у пользователя права на документ. Документ относится к Измерению, Пользователь или определенные роли имеют определенные права на документ.

В чем проблема? (в конце концов ;))
Ролей недостаточно, чтобы определить, что пользователю разрешено видеть / получать доступ / загружать определенный элемент. Недостаточно сказать, что определенный элемент навигации доступен для менеджеров. Когда пользователь запрашивает измерение 1000, мы должны проверить, что у пользователя есть не только роль менеджера, но и роль менеджера для измерения 1000.

Обобщенная:

Как мы можем ограничить пользователей их учетными записями / измерениями?
(помните, суперпользователи видят все измерения, некоторые менеджеры только конкретные измерения)

Как мы можем применять роли на уровне продукта / измерения? (пользователь X может быть основным контактом для измерения 1, а просто менеджером для измерения 2)

Как мы можем ограничить доступ менеджера к экрану отчетов и только к отчетам их отдела?

Все с магией классов asp.net, возможно, с собственной реализацией ролевого провайдера.

Подобный вопрос / проблема Stackoverflow
ASP.NET, как управлять пользователями с разными типами ролей