Как работает авторизация местоположения, когда у пользователя несколько ролей? - PullRequest
4 голосов
/ 07 ноября 2011

Мой web.config имеет это правило авторизации:

  <location path="Views/Administrator">
    <system.web>
      <authorization>
        <allow roles="roleA, roleB" />
        <deny users="*" />
      </authorization>
    </system.web>
  </location>

Что это значит?

Когда я тестирую процесс входа в систему, пользователь в roleA или пользователь в roleB может получить доступ ко всему содержимому в Views / Administrator, НО, когда пользователь входит в систему с roleC , ему запрещен доступ.Пока это имеет смысл.На первый взгляд это означает, что пользователь с roleA или roleB разрешен. НО когда я назначаю роли roleA и roleC тому же пользователю и пытаюсь войти в систему, мне отказано.Это подразумевает, что правило авторизации просматривает все роли, в которых находится пользователь, и запрещает доступ пользователя, если у пользователя нет всех ролей, определенных в теге <allow />.

Итак: «Какавторизация местоположения работает, когда у пользователя несколько ролей? "

Ответы [ 2 ]

3 голосов
/ 07 ноября 2011

Хорошо, я только что создал новое веб-приложение, которое использует стандартный менеджер ролей.Я создал три роли: roleA, roleB, roleC.и в моем приложении я добавил ту же конфигурационную запись, которую вы использовали выше, но изменил путь к странице «About.aspx» по умолчанию.

После тестирования различных конфигураций ролей роли, похоже, работают точно так, как и следовало ожидать,Если пользователь является членом нескольких ролей, например roleA и roleC, если вы настроили конфигурацию так, как вы это сделали, разрешите «roleA, roleB», чтобы мой пользователь получил доступ независимо от порядка.Убери роль A в конфиге, и у моего пользователя больше нет доступа.Уберите roleB и прочитайте roleA, мой пользователь снова имеет доступ, прочитал их обоих, у пользователя есть доступ.

Редактировать 2 - Удаление изображения с помощью «RoleGroup», как я полагаю, это приводит к смущению.

http://www.asp.net/security/tutorials/role-based-authorization-cs.
Имеет довольно хорошее объяснение того, как работает аутентификация на основе ролей.Нет большой информации о нескольких ролях, хотя.

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

http://www.4guysfromrolla.com/articles/082703-1.2.aspx

Редактировать - Добавление информации о моем тесте.

Для дальнейшегообъясните, как я тестирую:

Я создал базового пользователя и 3 роли в инструменте веб-администрирования.Создано 3 роли.И назначил роль A и роль C моему пользователю.

Web Admin

Отсюда мой конфигурационный файл.Это веб-конфигурация по умолчанию для нового проекта с добавленными выше настройками.

<?xml version="1.0"?>
<configuration>
  <connectionStrings>
    <add name="ApplicationServices" connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\aspnetdb.mdf;User Instance=true"
     providerName="System.Data.SqlClient" />
</connectionStrings>
<system.web>
    <compilation debug="true" targetFramework="4.0" />

 <authentication mode="Forms">
   <forms loginUrl="~/Account/Login.aspx" timeout="2880" />
 </authentication>

<membership>
  <providers>
    <clear/>
    <add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="ApplicationServices"
         enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false"
         maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10"
         applicationName="/" />
  </providers>
</membership>

<profile>
  <providers>
    <clear/>
    <add name="AspNetSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider" connectionStringName="ApplicationServices" applicationName="/"/>
  </providers>
</profile>

<roleManager enabled="true">
  <providers>
    <clear />
    <add connectionStringName="ApplicationServices" applicationName="/"
      name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider" />
    <add applicationName="/" name="AspNetWindowsTokenRoleProvider"
      type="System.Web.Security.WindowsTokenRoleProvider" />
  </providers>
</roleManager>

</system.web>

<system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
</system.webServer>


 <location path="About.aspx">
    <system.web>
        <authorization>
            <allow roles="roleA, roleB" />
            <deny users="*" />
        </authorization>
    </system.web>
 </location>

0 голосов
/ 07 ноября 2011

Попробуйте сделать это программно, как уже упоминалось ранее.if (User.IsInRole ("RoleC")) {... и т. д.}

...