Как я могу ограничить управляющие действия asp.net в зависимости от роли пользователя? - PullRequest
3 голосов
/ 12 марта 2010

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

Я использую систему конфигурации asp.net дляобработка аутентификации и ролей.Эта система ограничивает доступ в зависимости от пути, поэтому я создавал дубликаты страниц для аутентифицированных и анон-путей.

Решение, которое сразу приходит на ум, - это проверка ролей в соответствующих обработчиках событий, ограничение возможных отображаемых действий.(вставьте / обновите / удалите кнопки), а также ограничьте, какие действия выполняются (для пользователей, которые могут знать, как выполнить действие при отсутствии кнопки.) Однако это решение не устраняет дублирование - я бы дублировал безопасностькодировать ряд страниц, а не дублировать страницы и ограничивать доступ по пути;последнее было бы значительно менее сложным.

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

Есть ли относительно простой способ сделать это (существуют ли такие элементы управления?) Или я должен просто придерживаться доступа на основе путей и дублирующих страниц?

Имеет ли смысл даже использовать два метода авторизации?Есть еще несколько страниц, предназначенных исключительно для обеих ролей, поэтому я все равно буду использовать авторизацию на основе пути.

Наконец, использование чего-то иного, чем авторизация на основе пути, будет противоречить типичному дизайну asp.netпрактики, по крайней мере, в контексте использования системы конфигурации asp.net?

Ответы [ 4 ]

3 голосов
/ 12 марта 2010

Наилучшим подходом будет добавление свойства в пользовательский элемент управления с указанием ролей или чего-то, что позволит пользователям таких ролей просматривать элемент управления. Поскольку у вас нет времени для этого, вы можете создать вспомогательный метод, который будет работать со свойством visible элемента управления. Примерно так:

<asp:Button id="UpdateButton" runat="server" Visible="<%# IsInRole("Admin") %>" /> 

Вы также можете создать свой собственный вспомогательный метод, который проверяет наличие дополнительных критериев.

2 голосов
/ 12 марта 2010

Для отображения элементов управления, вы можете использовать asp: LoginView.

http://www.codedigest.com/Articles/ASPNET/78_LoginView_Controls_with_Roles_in_ASPNet_20.aspx

для «пользователей, которые могут знать, как выполнить действие при отсутствии кнопки»,

вы могли бы использовать if User.IsInRole("Role_name") then ... перед выполнением обновления. Вы также можете добавить безопасность для функции, используя:

<PrincipalPermission(SecurityAction.Demand, role:="Role_name")> _

http://www.4guysfromrolla.com/webtech/121901-1.2.shtml

1 голос
/ 22 ноября 2011

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

http://www.asp.net/security/tutorials/user-based-authorization-cs

http://www.asp.net/data-access/tutorials/limiting-data-modification-functionality-based-on-the-user-cs

и для дальнейшего чтения вы можете взглянуть на эти серии, снова написанные Скотт Митчелл

http://www.4guysfromrolla.com/articles/120705-1.aspx

0 голосов
/ 12 марта 2010

Одним из решений было бы написать несколько пользовательских хранимых процедур на стороне базы данных. Если вы передали логический флаг для auth'ed против unauth'ed, тогда ваш SQL-код может обработать, какие результаты возвращаются и какие действия выполняются.

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

По сути, вам необходимо «условно привязать» вашу сетку к ее источнику данных, определяя, какую хранимую процедуру вызывать, проверяя роль пользователя.

Надеюсь, это немного поможет!

...