ASP.NET MVC Forms аутентификация и неаутентифицированные действия контроллера
-
08-07-2019 - |
Вопрос
У меня есть сайт 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, затем используйте фильтры авторизации (см. Ответ Миккеля) для защиты отдельных контроллеров и / или действий.