Роли для доступа к сервису белых меток - PullRequest
0 голосов
/ 31 марта 2009

Хорошо,

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

Что-то вроде Нина. Кроме того, у меня есть только 1 базовый логин, и доступ к каждому мини-сайту предоставляется (прямо сейчас) через роли.

То, как я сейчас это делаю, таково:

Каждый раз, когда создается новый мини-сайт, скажем, бла, я создаю 2 роли в своем приложении. blah_users и blah_admin

Пользователь, создающий мини-сайт, получает роль - blah_admin, а любой другой пользователь, желающий присоединиться к этому мини-сайту (или сети), получает роль - blah_user.

Любой может просматривать данные с любого веб-сайта. Однако для добавления данных необходимо быть участником этого мини-сайта (ему должна быть назначена роль blah_user)

Проблема, с которой я сталкиваюсь, заключается в том, что при создании системы, основанной на ролях, мне приходится делать кучу вещей вручную. Элементы управления Asp.Net 2, которые работают со свойством User.IsAunthenticated, теперь для меня практически бесполезны, поскольку наряду со свойством IsAuthenticated я также должен проверить, имеет ли пользователь надлежащую роль.

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

Этот веб-сайт разрабатывается в ASP.Net 2 для IIS 6. Спасибо за тонну!

1 Ответ

1 голос
/ 31 марта 2009

Боюсь, что стандартные вещи, связанные с ролями, в ASP.NET - это не то, что вам нужно. Вы можете попытаться изменить модуль аутентификации, чтобы он:

  1. Войдите в систему с помощью cookie.
  2. Определите, какие роли выполняет ваш посетитель. Возможно, вы будете использовать какую-то специальную таблицу, которая соответствует пользователю и сайту.
  3. Создание настраиваемого участника с перечисленными ролями пользователей и назначение идентификатора и принципала текущему запросу.

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

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

Добавление: Еще одна возможность для изучения - это Приложение, которое существует в системе аутентификации ASP.NET. Может быть, можно выделить каждый дочерний сайт в отдельное приложение?

Обновление: Метод, который работает для нашего приложения.

  1. Не создавайте много клонированных ролей. Используйте только два: пользователи и администратор. Если ваши сайты общедоступны, то роль «пользователи» может быть просто глобальной - пользователь на одном сайте не отличается от пользователя на другом сайте. Если «пользователи» и «все» - разные роли, то, конечно, «пользователи» также должны быть связаны с сайтом.

  2. Используйте стандартных пользователей членства ASP.NET, но не используйте стандартный механизм ролей.

  3. Создать механизм для хранения отношений между сайтом и пользователем. Это может быть простая таблица, содержащая идентификатор сайта, пользователя и роль.

  4. То, что вам нужно переопределить, это метод IsInRole. (Метод s , если быть точным, я расскажу об этом позже). Этот метод находится в интерфейсе IPrinciple, поэтому вы должны создать свой собственный основной объект. Это довольно просто.

    1. Метод IsInRole этого типа должен выглядеть, взять текущий сайт (из HttpRequest), посмотреть таблицу site-user и получить роли
  5. Затем вы должны связать своего принципала с запросом. Сделайте это в событии PostAuthenticateRequest.

  6. Существует также RoleProvider. Честно говоря, я не уверен, когда он используется, но у него также есть метод IsInRole. Мы можем переопределить это таким же образом. Но другие методы этого провайдера сложнее. Например AddUsersToRoles. Он принимает массив имен пользователей и ролей, но к какому контексту (сайту) его следует добавить? К текущему? Не уверен, потому что я не знаю, когда этот метод вызывается. Так что это требует некоторых экспериментов. Я вижу (помогает Reflector), что RopePrincipal сам по себе использует RoleProvider для получения списка ролей, поэтому, возможно, он реализует только RoleProvider, используя стандартную принципал. Для нашего приложения это не так, поэтому я не могу сказать, какие проблемы могут быть скрыты здесь.

...