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.
Ответы
Ответ 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) для защиты отдельных контроллеров и/или действий.