Включение проверки подлинности Forms для нескольких вложенных папок на сайте

StackOverflow https://stackoverflow.com/questions/821206

  •  03-07-2019
  •  | 
  •  

Вопрос

Мы пытаемся реализовать formAuthentication на нашем сайте, но в сценарии, для которого нам пока не удалось найти решение - кроме создания нашего собственного HttpModule и выполнения собственной логики - поэтому я подумал, что ' d бросить вопрос там, чтобы видеть, было ли это действительно единственным решением.

Мы хотели бы использовать formsAuthentication поверх пользовательских провайдеров членства, но хотели бы использовать другого провайдера для разных папок. Наш сайт разбивает эти разделы на подпапки (например, ~ / Admin, ~ / GoldCustomer, ~ / SilverCustomer, ~ / BronzeCustomer), поэтому мы хотели бы использовать разных провайдеров членства для каждого раздела / подпапки. Используя фреймворк для поддержки этого, мы реализовали бы наш web.config следующим образом:

<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">
<location path="Admin">
<system.web>
  <authentication mode="Forms">
    <forms name="AdminAuth" loginUrl="~/AdminLogin.aspx" />
  </authentication>
  <membership defaultProvider="AdminProvider" >
    <providers >
      <add connectionStringName="ConnString" name="AdminProvider" type="Assembly.AdminMembershipProvider" ... />
    </providers>
  </membership>
</system.web>
</location>
<location path="GoldCustomer">
  <system.web>
  <authentication mode="Forms">
    <forms name="GoldCustomerAuth" loginUrl="~/GoldCustomerLogin.aspx" />
  </authentication>
  <membership defaultProvider="GoldCustomerProvider" >
    <providers >
      <add connectionStringName="ConnString" name="GoldCustomerProvider" type="Assembly.GoldCustomerMembershipProvider" ...="" />
    </providers>
  </membership>
</system.web>
</location>
<system.web>
  <compilation debug="true" />
  <authentication mode="Forms" />
</system.web>
</configuration>

Это может привести к ошибке во время выполнения:

Ошибка использовать раздел, зарегистрированный как allowDefinition = 'MachineToApplication' за пределами уровня приложения. Эта ошибка может быть вызвана тем, что виртуальный каталог не настроен как приложение в IIS.

Line 11:   <location path="Admin">
Line 12:     <system.web>
Line 13:       <authentication mode="Forms">
Line 14:         <forms name="FormsAdmin" loginUrl="~/login.aspx" />
Line 15:       </authentication>

Кажется, что единственный способ выполнить то, что мы пытаемся, - это использовать собственный HttpModule или изменить наш подход (например, разбить папки на разные веб-приложения в IIS). Это правильно, или я что-то упустил? Или есть другие альтернативы, о которых я не знаю?

Спасибо за вашу помощь!

Это было полезно?

Решение

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

Альтернативным решением могут быть формы входа в шлюз, которые перенаправляют пользователя в конкретную форму входа в папку на основе ReturnUrl переменной строки запроса, и эта форма будет использовать провайдера, которого он хочет подтвердить пользователем. Затем он использует FormsAuthentication.RedirectFromLoginPage для установки файла cookie аутентификации и перенаправления на предыдущую страницу. Вы можете установить роли и использовать безопасность на основе ролей для управления доступом к каждой папке с тегом <authorization> в web.config.

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top