Разрешить публичный доступ к действиям контроллера на сайте WebForms + MVC - PullRequest
1 голос
/ 04 января 2011

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

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

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

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

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

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

Edit:

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

Редактировать 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

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

Ответы [ 2 ]

0 голосов
/ 04 января 2011

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

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

0 голосов
/ 04 января 2011

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

...