Можно ли переопределить поведение [Authorize] по умолчанию в ASP.NET MVC?

StackOverflow https://stackoverflow.com/questions/1315524

Вопрос

Я задавался вопросом, могу ли я переопределить поведение [Authorize] по умолчанию в ASP.NET MVC.Я знаю, что могу создать новый фильтр действий, создать свой собственный атрибут и так далее;Мне просто интересно, могу ли я просто изменить поведение [Authorize] и заменить его работу своим собственным кодом?

Редактировать:Парни и Девушки.Я ценю ваш вклад, но, как я уже писал, я нет хочу ввести новый атрибут [XYZAuthorize].Я знаю, как это сделать.Я хочу сохранить обозначение [Authorize], но просто изменить способ его работы.

Это было полезно?

Решение

Да, взгляните на документы MSDN для получения AuthorizeAttribute: http://msdn.microsoft.com/en-us/library/system.web.mvc.authorizeattribute.aspx.

В принципе, вы можете переопределить метод OnAuthorization() и настроить поведение.Существуют и другие виртуальные методы для этого атрибута.

Редактировать:Как указал Бруно, вы можете переопределить метод AuthorizeCore().Основное отличие заключается в том, что AuthorizeCore() принимает HttpContextBase, в то время как OnAuthorization() принимает AuthorizationContext.Экземпляр AuthorizationContext предоставляет вам дополнительную информацию, такую как контроллер, RequestContext и RouteData.Он также позволяет вам указать ActionResult .

AuthorizeCore() более ограничен в информации, к которой вы можете получить доступ, а также в результате, который вы можете вернуть, но если вам нужно авторизовать кэшированные данные, то ваша логика должна обрабатывать случай, когда у вас нет каких-либо дополнительных данных (поскольку данные передаются из кэша до того, как запрос направляется через конвейер MVC).

Как всегда, вам необходимо понять свой сценарий, доступные инструменты и компромиссы между ними.

Другие советы

Вы можете подкласс Authorizeatribute Filter и поместить в него свою собственную логику.

Давайте посмотрим пример. Допустим, вы хотите всегда разрешать местные соединения. Однако, если это удаленное соединение, вы хотели бы сохранить обычную логику авторизации.

Вы могли бы сделать что -то вроде:

public class LocalPermittedAuthorizeAttribute : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
        {
            return (httpContext.Request.IsLocal || base.AuthorizeCore(httpContext)));
        }
}

Или вы всегда можете разрешить определенный удаленный адрес (например, ваша машина).

Вот и все!

РЕДАКТИРОВАТЬ: Забыли упомянуть, вы будете использовать его так же, как и используете фильтр AuthorizeAttribute:

class MyController : Controller
{
    [LocalPermittedAuthorize]
    public ActionResult Fire()
    {
        Missile.Fire(Datetime.Now);
    }
}

Внедрите свой собственный поставщик роли и установите свое приложение для его использования. Затем атрибут Authorize будет уважать ваш код атеоризации.

Я вижу только 2 способа: переоценить AuthorizeAttribute.OnAuthorization метод или создание собственного атрибута авторизации с нуля.

1) Очень легко:

public class CustomAuthorizeAttribute : AuthorizeAttribute
{
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        base.OnAuthorization(filterContext);

        /// your behavior here
    }
}

2) Также легко - просто посмотрите на исходность ASP.NET MVC, AuthorizeatTribute.cs файл

Похоже, вы можете реализовать пользовательский фильтр как обычно (и унаследовать AuthordizeatTribute, если хотите), а затем создать новое действие, которое наследует ControlleractionInvoker и переопределяет GetFilters. В GetFilters вы звоните base.GetFilters() Чтобы получить список фильтров, итерация через авторизацию и заменить вызовы для авторизациифильтера с вызовами в ваш пользовательский фильтр.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top