Можно ли отключить авторизацию для одного действия в контроллере MVC?
У меня есть атрибут авторизации на контроллере, но я хотел бы отключить его при одном действии.
Я создал свой собственный фильтр авторизации и добавил "Анонимный" в список "Роли". В моем фильтре я вернусь true, если в списке роли появится Аноним.
Однако, похоже, он не прошел страницу входа в систему, как если бы авторизация контроллера предотвращала что-либо еще.
Ответы
Ответ 1
Вы можете добавить [Authorize]
к классу контроллера, а затем добавить [AllowAnonymous]
к единственному действию, которое вы не хотите разрешать. Пример:
[Authorize]
public class AccountController : Controller
{
public ActionResult Profile()
{
return View();
}
[AllowAnonymous]
public ActionResult Login()
{
return View();
}
}
Ответ 2
Вы можете создать свою собственную версию атрибута.
Есть очень похожий вопрос, и есть довольно хороший ответ, как реализовать свой собственный атрибут, который обрабатывает эту ситуацию.
Переопределить атрибут авторизации в ASP.NET MVC
Btw. вы также можете создать свой контроллер, который будет иметь разрешение по умолчанию.
Base
[Authorize]
public abstract class SecureControllerBase : Controller
{
}
Использование
public class MyController : SecureControllerBase
{
}
Ответ 3
Я только что сделал решение, используя Azure ACS в качестве федеративного провайдера удостоверений, и принятый ответ не сработал у меня. Для тех, кто борется, мое решение состояло в том, чтобы полностью обойти безопасность для требуемого контроллера/просмотров.
Создайте новый контроллер/представления для тех действий, которые вам необходимо обойти авторизацию.
И в web.config добавьте следующее,
<location path="TheNameOfTheControllerYouWantToBypass">
<system.web>
<authorization>
<allow users="*" />
</authorization>
</system.web>
</location>
Ответ 4
Просто добавьте атрибут в действия, которые вы хотите фильтровать, а не в класс контроллера. Не украшая действия, они не будут отфильтрованы, если контроллер или один из его базовых контроллеров не получил атрибут.
Ответ 5
Не добавляйте AuthorizationAttribute в свой метод действия, когда вам, например, это не требуется.
Мой пользовательский атрибут
public class AuthorizationFilterAttribute : AuthorizeAttribute
{
Some code...
}
Мой контроллер
public class UserController : BaseController, IDisposable
{
[AuthorizationFilterAttribute]
public ActionResult UserList()
{
//Authorize attribute will call when this action is executed
}
public ActionResult AddUser()
{
//Authorize attribute will not call when this action is executed
}
}
Я надеюсь, вы поняли, что я пытаюсь вам сказать.
============================ Обновленный ответ ==================== ============
Создайте еще один атрибут, как показано ниже.
public sealed class AnonymousAttribute : Attribute { }
Пожалуйста, поместите приведенный ниже код в свой метод OnAuthorization.
public override void OnAuthorization(AuthorizationContext filterContext) {
bool checkForAuthorization = filterContext.ActionDescriptor.IsDefined(typeof(AnonymousAttribute), true)
|| filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(AnonymousAttribute), true);
if (!skipAuthorization) {
base.OnAuthorization(filterContext);
}
}