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

Можно ли отключить авторизацию для одного действия в контроллере MVC?

У меня есть атрибут авторизации на контроллере, но я хотел бы отключить его при одном действии. Я создал свой собственный фильтр авторизации и добавил "Анонимный" в список "Роли". В моем фильтре я вернусь true, если в списке роли появится Аноним.

Однако, похоже, он не прошел страницу входа в систему, как если бы авторизация контроллера предотвращала что-либо еще.

4b9b3361

Ответ 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);
            }
        }