Подтвердить что ты не робот

ASP.NET MVC Forms аутентификация и действия без проверки подлинности контроллера

У меня есть сайт ASP.NET MVC, который заблокирован с помощью проверки подлинности с помощью форм. У web.config есть

<authentication mode="Forms">
    <forms defaultUrl="~/Account/LogOn" loginUrl="~/Account/LogOn" timeout="2880"/>
</authentication>
<authorization>
    <deny users="?"/>
</authorization>

Ни одна из моих страниц, кроме учетной записи /LogOn, не может быть просмотрена, если пользователь не аутентифицирован.

Теперь я пытаюсь добавить IPN PayPal на свой сайт, и для этого мне нужно иметь две страницы, которые обрабатывают подтверждение оплаты PayPal и страницу с благодарностью. Эти две страницы должны быть доступны для анонимных пользователей.

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

В принципе, я хочу, чтобы класс AccountController не имел авторизации для большинства методов, за исключением нескольких. Сейчас похоже, что для анонимных пользователей доступен только метод LogOn.

4b9b3361

Ответ 1

Да, вы можете. В вашем AccountController есть атрибут [Авторизовать] на уровне класса (чтобы весь контроллер был ограничен) или по определенным методам.

Чтобы ограничить определенные действия, вы просто используете атрибут Authorize для методов, которые обрабатывают эти действия, и оставляйте класс контроллера неограниченным.

Вот несколько примеров... надеюсь, что это поможет

Чтобы пользователи могли войти в систему, используйте:

[Authorize]
public class SomeController : Controller

// Or
[Authorize]
public ActionResult SomeAction()

Чтобы ограничить доступ для определенных ролей, используйте:

[Authorize(Roles = "Admin, User")]
public class SomeController : Controller

// Or
[Authorize(Roles = "Admin, User")]
public ActionResult SomeAction()

И чтобы ограничить доступ для определенных пользователей, используйте:

[Authorize(Users = "Charles, Linus")]
public class SomeController : Controller

// Or
[Authorize(Users = "Charles, Linus")]
public ActionResult SomeAction()

Как вы можете видеть, вы можете либо использовать атрибут на уровне класса, либо на уровне метода. Ваш выбор!

Ответ 2

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

Вот два метода, о которых я могу думать:

1- Атрибут местоположения в Web.config(не уверен, что это будет работать с маршрутизацией MVC и т.д.)

После

<system.web> stuff </system.web>

в файле web.config добавьте следующее:

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

Где Account/ActionOne - это имя метода действия, которому вы хотите предоставить анонимный доступ. Для второго действия скопируйте приведенный выше код и вставьте его сразу после него и измените имя действия.

Я не уверен, что это будет работать из-за маршрутизации MVC и т.д., но попробуйте.

2- Базовый контроллер

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

[Authorize]
public class AuthorizeControllerBase : Controller {}

Затем все ваши контроллеры наследуют от него:

public class AccountController : AuthorizeControllerBase
{
      // your actions etc.
}

Это приведет к тому, что любой контроллер, который наследует от AuthorizeControllerBase, потребует авторизации/регистрации для вызова любых методов.

Затем вам нужно будет удалить из вашего web.config

Ответ 3

Вместо того, чтобы по умолчанию сохранять все ресурсы на своем веб-сайте, а затем искать способ анонимного доступа к отдельным ресурсам, вам, вероятно, лучше использовать противоположный подход. Не указывайте правила авторизации в вашем web.config, затем используйте фильтры авторизации (см. Ответ Mickel) для защиты отдельных контроллеров и/или действий.