Использование проверки подлинности/авторизации с помощью форм с измененными URL-адресами

Я делаю быстрый тест песочницы с некоторыми переписанными URL-адресами (пример взят из блога Скотта Гатри) и аутентификацией/авторизацией форм.

У меня очень простая установка.

~/View/(\d{1,6})      =>      ~/Public/View.aspx?ContentID=$1

И

~/Buy/(\d{1,6})       =>      ~/Private/Purchase.aspx?ContentID=$1

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

Затем я пошел и включил аутентификацию/авторизацию с помощью форм для этих двух каталогов в Web.Config. Настройте следующим образом

  <location path="Private">
    <system.web>
      <authorization>
        <deny users="?" />
      </authorization>
    </system.web>
  </location>
  <location path="Public">
    <system.web>
      <authorization>
        <allow users="*" />
      </authorization>
    </system.web>
  </location> 

Это отлично работает, когда я просматриваю 2 исходных URL-адреса (.aspx), но вообще не срабатывает, когда я просматриваю переписанные версии URL.

Я попытался добавить разделы <location> для Buy отдельно, но это все еще не приводит к срабатыванию модуля авторизации/аутентификации.

Предположительно, это связано с тем, что он не рассматривает эти URL-адреса как ресурсы ASPX... Я могу обойти это, заставив правило перезаписи искать

    <LookFor>~/Buy/(\d{1,6})\.aspx</LookFor>

то есть заставить переписанную версию иметь ASPX в конце, но это просто кажется уродливым. Есть ли способ заставить обработчики аутентификации запускать любой тип URL-адреса независимо от расширения (или его отсутствия)


person Eoin Campbell    schedule 02.06.2009    source источник
comment
Скотт Гатри описывает 4 различных подхода, какой из них используете вы? веб-блоги. asp.net/scottgu/archive/2007/02/26/   -  person MyItchyChin    schedule 18.07.2009


Ответы (4)


Чтобы использовать встроенную аутентификацию, вам нужно будет решить, хотите ли вы аутентифицироваться на основе исходных «сырых» URL-адресов или переписанных. Похоже, что используемое вами средство перезаписи URL-адресов подключено к событию после того, как аутентификация уже была выполнена, поэтому соблюдаются только правила «Общая» и «Частная» папки. Если вы хотите пройти аутентификацию на основе переписанных URL-адресов, вам придется использовать переписчик, который подключается к более раннему событию (например, BeginRequest), а также обновляет ваш файл web.config с помощью переписанных URL-адресов.

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

Пожалуйста, смотрите эту статью для получения дополнительной информации:

http://msdn.microsoft.com/en-us/library/ms972974.aspx

Надеюсь, это поможет.

person Dave R.    schedule 23.07.2009

В ASP.NET 4.0 (и я думаю, что в 3.5 SP1) включена новая функция маршрутизации. Преимущество использования этой функции маршрутизации заключается в том, что теперь она поддерживается непосредственно внутри ASP.NET, и поэтому вы можете указать, что при выполнении маршрута он должен учитывать параметры авторизации для фактического файла .ASPX.

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

person Pete    schedule 19.08.2009

Непонятно, какую библиотеку перезаписи URL-адресов вы используете, но, судя по всему, я думаю, что это, вероятно, urlrewriter.net, однако я не вижу никакого тега?

person rtpHarry    schedule 26.08.2009

попробуйте включить аутентификацию и авторизацию форм для всех запросов. По умолчанию он включен только для запросов asp.net, таких как .aspx. Можно сделать в IIS (7) или напрямую в web.config в разделе webserver/modules

<system.webServer>
   <modules>
        <remove name="FormsAuthentication" />
        <add name="FormsAuthentication" type="System.Web.Security.FormsAuthenticationModule" preCondition=""/>
        <remove name="UrlAuthorization" />
        <add name="UrlAuthorization" type="System.Web.Security.UrlAuthorizationModule" preCondition="" />
   </modules>
</system.webServer>
person bart    schedule 23.04.2014