ASP.NET 3.5 IIS7 Реализация безопасности ролей - PullRequest
3 голосов
/ 22 сентября 2009

Я работаю над приложением ASP.NET 3.5, работающим на IIS7 (Server '08) с использованием стандартной аутентификации MS Forms и SqlRolesProvider. (Я использовал инструмент aspnet_regsql для генерации таблиц).

У нас есть три роли: SysAdmins, AppAdmins и Users. Все пользователи находятся в Users, и пользователь может быть либо в SysAdmins, AppAdmins, либо в обоих.

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

Вот соответствующие биты моей текущей конфигурации:

<configuration>
  ...
  <system.web>
    <authentication mode="Forms">
      <forms loginUrl="/client/security/login.aspx" timeout="480" />
    </authentication>
    <authorization>
    </authorization>
    <roleManager defaultProvider="SqlRoleProvider" enabled="true" cacheRolesInCookie="true" cookieName="EquityTouch.Roles" cookieProtection="All" cookieSlidingExpiration="true" cookieTimeout="60">
      <providers>
        <clear />
        <add name="SqlRoleProvider" applicationName="EquityTouch" connectionStringName="SQLProvider" type="System.Web.Security.SqlRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
      </providers>
    </roleManager>
    ...
  </system.web>
  <system.webServer>
    <security>
      <authorization>
        <add accessType="Deny" users="?" />
      </authorization>
    </security>
    ...
  </system.webServer>
  <location path="admin">
    <system.webServer>
      <security>
        <authorization>
          <remove users="*" roles="" verbs=""/>
          <add accessType="Allow" roles="SysAdmins,AppAdmins" />
        </authorization>
      </security>
    </system.webServer>
    <system.web>
      <authorization>
        <deny users="*"/>
        <allow roles="SysAdmins,AppAdmins"/>
      </authorization>
    </system.web>
  </location>
</configuration>

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

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

UPDATE

При удалении раздела из элемента страницы ASPX в этой папке возвращаются правильно! К сожалению, файлы .js в этой папке все еще заблокированы для всех пользователей ... В идеале я хотел бы также заблокировать файлы .js от непривилегированных глаз. Поэтому я все еще ищу помощи.

1 Ответ

6 голосов
/ 22 сентября 2009

Даже в режиме IIS7 Integrated Pipeline я успешно использую старые блоки авторизации в стиле IIS6. Пожалуйста, попробуйте код ниже, который включает в себя следующие изменения:

  1. Добавлено к первому блоку авторизации
  2. Переключен порядок и в блоке авторизации для конкретного местоположения
  3. Удалены блоки авторизации, зависящие от местоположения
  4. Чтобы пропустить файлы js, мой лучший совет - переместить их в отдельную папку и разрешить доступ к этой папке всем, кроме анонимных пользователей (см. Ниже). Кроме того, вы можете назвать каждый JS-файл в атрибуте пути местоположения. Однако это решение менее ремонтопригодно.

Пожалуйста, дайте мне знать, если это работает для вас!

<configuration>
  <system.web>
    <authentication mode="Forms">
      <forms loginUrl="/client/security/login.aspx" timeout="480" />
    </authentication>
    <authorization>
      <deny users="?"/>
    </authorization>
    <roleManager defaultProvider="SqlRoleProvider" enabled="true" cacheRolesInCookie="true" cookieName="EquityTouch.Roles" cookieProtection="All" cookieSlidingExpiration="true" cookieTimeout="60">
      <providers>
        <clear />
        <add name="SqlRoleProvider" applicationName="EquityTouch" connectionStringName="SQLProvider" type="System.Web.Security.SqlRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
      </providers>
    </roleManager>
  </system.web>

  <location path="admin">
    <system.web>
      <authorization>
        <allow roles="SysAdmins,AppAdmins"/>
        <deny users="*"/>             
      </authorization>
    </system.web>
  </location>
  <location path="js">
    <system.web>
      <authorization>
        <deny users="?"/>
        <allow users="*"/>
      </authorization>
    </system.web>
  </location>
</configuration>
...