Разрешить публичный доступ к действию контроллера на сайте WebForms + MVC

У меня есть устаревший веб-сайт ASP.Net, в который я интегрирую MVC. Я использую аутентификацию веб-форм со стандартным тегом авторизации в web.config:

<authorization>
  <deny users="?"/>
</authorization>

В прошлом мне удавалось сделать общедоступными различные папки, используя такие места, как:

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

С дополнительным MVC и несколькими контроллерами мне нужно сделать несколько действий контроллера полностью общедоступными. Однако я не могу сделать это, используя тег местоположения в web.config. Если я попытаюсь перейти по URL-адресу действия, не пройдя аутентификацию, ASP.Net перенаправит меня обратно на мою страницу входа (указанную в web.config). Я не использую атрибут авторизации ни в одном из этих действий контроллера.

Как мне открыть доступ к ним при нарушении безопасности для всех веб-форм, которые нуждаются в защите?

Редактировать:

Я хочу прояснить, что я использую [Авторизовать] для действий, которые хочу защитить. Действия в вопросах, которые я хочу сделать общедоступными, не используют атрибут [Авторизовать] и по-прежнему недоступны, если вы не вошли в систему.

Редактировать 2:

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

<location path="WC">
    <system.web>
        <authorization>
            <allow users="*" />
        </authorization>
    </system.web>
</location>

И маршрут:

routes.MapRoute(
          "WC", // Route name
          "WC/{id}",
          new { action = "GetWC", controller = "WC" } // URL with parameters
        );

И URL-адрес, который не работает:

http://localhost/MyWebApp/WC/42

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


person Jason Jackson    schedule 04.01.2011    source источник
comment
Можете ли вы привести пример элементов местоположения и маршрутов, которые вы пытаетесь использовать? Несоответствие между ними кажется наиболее вероятной причиной.   -  person Tom Clarkson    schedule 05.01.2011


Ответы (2)


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

person Jonas    schedule 04.01.2011

Используйте System.Web.Mvc.AuthorizeAttribute. Вы можете украсить им либо сам класс контроллера (что приведет к защите всех методов действия), либо вы можете украсить сам метод действия для более тонкого управления.

Если ни один из них не оформлен, то их могут вызывать все пользователи (включая анонимных). Если вы просто используете [Authorize], то только авторизованные пользователи могут вызывать метод действия. Вы также можете передать список ролей, разделенных запятыми, чтобы указать список, из которого пользователь должен иметь хотя бы одну из ролей, чтобы вызвать метод действия.

person Brian Ball    schedule 04.01.2011
comment
Тогда есть что-то еще, что вызывает вашу проблему. По умолчанию действия общедоступны; только когда вы украсите его (или его класс) авторизацией, они станут защищенными. Возможно, вам потребуется опубликовать различные разделы вашего web.config, чтобы помочь нам получить ответ (элемент аутентификации, возможно, любые элементы авторизации, которые у вас есть). - person Brian Ball; 05.01.2011
comment
Исследуя это весь день, я нашел утверждения, противоречащие этому. Насколько я понимаю, OOB сайт MVC широко открыт, а сайт WebForms - нет. Похоже, разница заключается в конфигурации авторизации в web.config. Я полностью запутался в этом, так как многие люди говорят вещи, которые противоречат друг другу, включая MVP на форумах MS. - person Jason Jackson; 05.01.2011
comment
У меня никогда не было проекта WebForms или MVC, который был бы чем-то большим, чем широко открытым из коробки. Ничто не мешает кому-то создать свой собственный шаблон проекта, поэтому могут быть некоторые, с которых они начинают в безопасности. - person Brian Ball; 05.01.2011
comment
Правильно. Я хочу сказать, что это существующий проект WebForms, в котором уже настроена UrlAuthorization, поэтому URL-адреса заблокированы, поскольку я могу даже разрешить авторизацию контроллера с помощью чего-то вроде IAuthorizationFilter, т.е. атрибута Authorize или контроллеров OnAuthorize. - person Jason Jackson; 05.01.2011
comment
Можете ли вы изменить свои пути таким образом, чтобы маршрутизация MVC не соответствовала URL-адресам различных страниц веб-форм? - person Brian Ball; 05.01.2011
comment
Извините, я думаю, что неправильно прочитал ваш раздел «Редактировать 2». Можете ли вы опубликовать часть своего класса WCController (например, объявление класса и объявление действия GetWC)? - person Brian Ball; 05.01.2011