Можно ли отключить авторизацию на одно действие в контроллере MVC? - PullRequest
54 голосов
/ 06 марта 2012

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

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

Ответы [ 5 ]

99 голосов
/ 14 декабря 2012

Вы можете добавить [Authorize] к классу контроллера, а затем добавить [AllowAnonymous] к единственному действию, которое вы не хотите авторизовать. Пример:

[Authorize]
public class AccountController : Controller
{
    public ActionResult Profile()
    {
        return View();
    }

    [AllowAnonymous]
    public ActionResult Login()
    {
        return View();
    }
}
3 голосов
/ 06 марта 2012

Вы можете создать собственную версию атрибута.

Есть очень похожий вопрос, и есть довольно хороший ответ, как реализовать свой собственный атрибут, который обрабатывает эту ситуацию.

Переопределить атрибут авторизации в ASP.NET MVC

Кстати.Вы также можете создать свой контроллер с авторизацией по умолчанию.

База

[Authorize]
public abstract class SecureControllerBase : Controller
{
}

Использование

public class MyController : SecureControllerBase
{
}
2 голосов
/ 15 января 2014

Я только что решил использовать Azure ACS в качестве федеративного поставщика удостоверений, и принятый ответ мне не помог.Для тех, кто борется, мое решение состояло в том, чтобы вообще обойти защиту для требуемого контроллера / представлений.

Создайте новый Контроллер / Представления для тех действий, которые необходимо обойти при авторизации.

И в файле web.config добавьте следующее:

 <location path="TheNameOfTheControllerYouWantToBypass">
  <system.web>
  <authorization>
    <allow users="*" />
  </authorization>
  </system.web>
 </location>
0 голосов
/ 06 марта 2012

Просто добавьте атрибут к Действиям, которые вы хотите фильтровать, а не к классу контроллера. Не декорируя действия, они не будут фильтроваться при условии, что у контроллера или одного из его базовых контроллеров нет атрибута.

0 голосов
/ 06 марта 2012

Не добавляйте 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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...