У меня есть веб-сайт ASP.NET 2.0 [пока нет ajax ...], который будет развернут в скомпилированной форме на нескольких сайтах клиентов. Обычно сайт предназначен только для внутренней сети. Некоторые клиенты доверяют всем своим людям и не заботятся об ограничении доступа к сайту и / или функциям страницы, другие никому не доверяют и хотят, чтобы только определенные люди и / или группы могли просматривать определенные страницы, нажимать определенные кнопки и т. д. al.
Я мог бы сделать какое-нибудь самодельное решение, возможно, управлять разрешениями доступа из таблицы базы данных, но прежде чем я пойду по этому пути, я подумал, что спрошу в SO: какое хорошее решение для этой ситуации? предпочтительно тот, которым можно полностью управлять в файле web.config и / или базе данных, поскольку восстановление веб-сайта невозможно (для клиента, и я не хочу, чтобы ему приходилось делать это снова и снова). Интеграция с Active Directory была бы бонусом, но не требованием (если только это не проще).
в качестве отправной точки, я думаю, что каждой странице / функциональной точке на сайте будет предоставлена идентификация и связана с группой разрешений ...
Обновлено: раздел авторизации web.config, чтобы разрешить / запретить доступ по роли и пользователю, это хорошо, но это только половина проблемы - другая половина контролирует доступ к отдельным методам (кнопкам, любым) на каждой странице. Например, некоторые пользователи могут просматривать whatchamacallits, в то время как другим разрешено редактировать, создавать, удалять или отключать / включать их. Все эти кнопки / ссылки / действия находятся на странице просмотра ...
[в идеале я бы сделал отключенные кнопки невидимыми, но здесь это не важно]
Обновлено: пока несколько хороших предложений, но пока нет полного решения - все еще склоняясь к решению на основе базы данных ...
Обновлено: платформа - Win2K / XP, Sql Server 2005, ASP.NET 2.0, без использования AJAX





Я предпочитаю предоставлять права доступа группам AD, а не отдельным пользователям. Я считаю, что это намного более гибко.
Я мало что знаю о вашем приложении, но вы можете посмотреть тег авторизации в файле web.config:
<authorization>
<!--
<deny users = "?" />
<allow users = "[comma separated list of users]"
roles = "[comma separated list of roles]"/>
<deny users = "[comma separated list of users]"
roles = "[comma separated list of roles]"/>
-->
</authorization>
Вы можете разделить файлы web.config для каждого каталога в своем веб-приложении и вложить каталоги. Каждый файл web.config может иметь собственный раздел авторизации. Если вы помещаете разные страницы в каждый каталог, вы можете эффективно управлять безопасностью, разрешая определенную роль в каждом файле web.config и запрещая все остальное. Затем вы можете управлять участниками каждой роли в активном каталоге. Я обнаружил, что это эффективное решение, потому что оно эффективно использует структуру безопасности Microsoft Active Directory и ASP.NET без написания собственных пользовательских материалов, а если вы используете роли, можно переложить управление членством в роли на кого-то, кто им не нужно прикасаться к файлу web.config, им просто нужно знать, как использовать консоль управления AD.
принято как "ответ", поэтому страница статистики перестанет меня приставать
Хотя я никогда раньше не использовал это на практике и не могу оспаривать его достоинства, я знаю, что .NET имеет безопасность кода на основе ролей, которая позволяет вам декларативно блокировать методы по ролям или пользователям. Например:
[PrincipalPermissionAttribute(SecurityAction.Demand, Name = "MyUser", Role = "User")]
public static void PrivateInfo()
{
//Print secret data.
Console.WriteLine("\n\nYou have access to the private data!");
}
Безопасность на основе ролей рассматривается более подробно здесь. Я не знаю, сильно ли это вам поможет, хотя, учитывая, что для его изменения потребуется перекомпиляция; однако добавление меток к методам происходит быстрее, чем создание логики для отображения / скрытия кнопок или проверки безопасности в коде.
Кроме того, вам понадобится прочитать для встроенной проверки подлинности Windows, чтобы получить возможность Active Directory.
спасибо, но атрибут требования безопасности просто вызовет исключение, когда неавторизованный пользователь нажимает кнопку, что не очень удобно делать ...
Похоже, вы могли бы использовать элемент управления LoginView, который может показывать панели элементов управления только определенным пользователям или ролям. Роли наиболее гибкие - если безопасность не требуется, поместите всех пользователей во все роли.
Используйте в сочетании со стандартной безопасностью web.config (интегрированные окна с активным каталогом или аутентификация с помощью форм (схема сервера asp 2 Sql или ваша собственная).
<asp:LoginView id = "LoginView1" runat = "server">
<RoleGroups>
<asp:RoleGroup Roles = "Admin">
<ContentTemplate>
<asp:LoginName id = "LoginName2" runat = "Server"></asp:LoginName>, you
are logged in as an administrator.
</ContentTemplate>
</asp:RoleGroup>
<asp:RoleGroup Roles = "User">
<ContentTemplate>
<asp:Button id = "Button1" runat = "Server" OnClick = "AllUserClick">
</ContentTemplate>
</asp:RoleGroup>
</RoleGroups>
</asp:LoginView>
еще один интересный подход, спасибо, но использование этого будет означать, что мне придется реплицировать большую часть html для каждой страницы несколько раз, и я не буду обрабатывать случай, когда пользователь может быть в нескольких ролях
Я думаю, мне придется объединить авторизацию AD с таблицами «функций и разрешений» в базе данных, чтобы получить необходимый нам детальный контроль -
Примеры:
Окончательное решение свело понятие «функция» к бинарному решению, можно или нельзя использовать, и добавило флаг «разрешающий / не разрешающий» для каждой функции. Это позволяет определять функции, которые могут использовать почти все, как «разрешающие», и тогда в таблице разрешений должны быть записаны только группы, которым отказано в разрешении на использование этой функции. Для функции, определенной как не разрешающая, по умолчанию никто не может использовать эту функцию, и вам необходимо создать записи в таблице разрешений для групп, которым разрешено использовать эту функцию. Похоже, что это дает лучшее из обоих миров решение, поскольку сокращает количество записей разрешений, необходимых для каждой функции.
Я думаю, что вам нужно здесь реализовать набор методов запроса разрешений либо в ваших бизнес-объектах, либо в вашем контроллере. Примеры: CanRead (), CanEdit (), CanDelete ()
Когда страница отображается, ей необходимо запросить бизнес-объект и определить авторизованные возможности пользователей, а также включить или отключить функции на основе этой информации. Бизнес-объект, в свою очередь, может использовать роли или дополнительные запросы к базе данных для определения разрешений активного пользователя.
Я не могу придумать способ декларативно определить эти разрешения централизованно. Их нужно распределить на реализацию функций. Однако, если вы хотите улучшить дизайн, вы можете использовать внедрение зависимостей, чтобы вставить авторизаторы в свои бизнес-объекты и, таким образом, сохранить отдельные реализации.
В книге Рокки Лхотки есть код, использующий эту модель. Новой версии пока нет в Google.
Я начал с этого подхода, но вскоре столкнулся с проблемами, так как не все разрешения основаны на доступе к сущности; некоторые просто поведенческие и довольно произвольные.
см. правки к моему ответу; бинарная авторизация группы AD плюс разрешение функции, похоже, решает все требования
интересный подход, но он решает только половину проблемы - некоторые пользователи могут просматривать определенную страницу, но не нажимать некоторые кнопки на этой странице ...