Требование нескольких ролей в Web.config авторизации - PullRequest
8 голосов
/ 29 апреля 2010

Можно ли указать, что в элементе полномочий файла web.config требуется несколько ролей? В настоящее время у меня есть этот блок в одном файле web.config моего сайта для определенного каталога:

<authorization>  
    <allow roles="Global, Region" />
    <deny users="*" />
</authorization>

Я только что выявил особый случай, когда человек с двумя правами доступа более низкого уровня, чем Global и Region, также должен иметь доступ к этому каталогу. Грубо говоря, я хочу что-то вроде этого:

<authorization>  
    <allow roles="GlobalManager, RegionManager, SiteManager && FooSite" />
    <deny users="*" />
</authorization>

Есть идеи? Я понимаю, что у меня, вероятно, должна быть новая роль в этом сценарии, но я бы хотел этого избежать. Спасибо!

Ответы [ 2 ]

3 голосов
/ 22 июня 2012

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

3 голосов
/ 29 апреля 2010

Я не думаю, что вы можете сделать это через текущие настройки, разрешенные в web.config. Хотя вы могли бы сделать что-то вроде следующего ... в качестве самой первой строки в вашем Page_Load событии для рассматриваемой страницы, используйте следующий код (VB):

If Not (User.IsInRole("Role1") AndAlso User.IsInRole("Role2")) Then _
    FormsAuthentication.RedirectToLoginPage()

Эта строка, конечно, предполагает, что вы используете FormsAuthentication. В противном случае вам нужно будет заменить FormsAuthentication.RedirectToLoginPage() на соответствующий код в зависимости от метода аутентификации.

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

В публичном модуле добавьте следующий код:

<System.Runtime.CompilerServices.Extension()> _
Public Function ManagesSite(target As System.Security.Principal.IPrincipal, siteName As String) As Boolean
    Return [ code here to look up whether this user can access the site specified ]
End Function 

Тогда вы можете написать предыдущий код как нечто более логичное, например:

If Not (User.IsInRole("SiteManager") AndAlso User.ManagesSite(Request.Url.Host)) Then _
    FormsAuthentication.RedirectToLoginPage()
...