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

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

Вопрос

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

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

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

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

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

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

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

Решение

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

Чтобы ограничить определенные действия, просто используйте атрибут 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()

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

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

Я не думаю, что есть " 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

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

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