Действительно ли возможно переопределить поведение по умолчанию [Авторизовывают] в ASP.NET MVC?

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

unsigned int r, a, b;
r = a+b;
if (r < a)
{
    // overflow
}

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

signed int r, a, b, s;
r = a+b;
s = a>=0;
if (s == (b>=0) && s != (r>=0))
{
    // overflow
}
9
задан Alex 22 August 2009 в 09:19
поделиться

5 ответов

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

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

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

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

6
ответ дан 4 December 2019 в 09:37
поделиться

Вы можете создать подкласс фильтра AuthorizeAttribute и поместить в него свою логику.

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

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

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

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

] Вот и все!

Edit: забыл упомянуть, вы будете использовать его так же, как и фильтр AuthorizeAttribute:

class MyController : Controller
{
    [LocalPermittedAuthorize]
    public ActionResult Fire()
    {
        Missile.Fire(Datetime.Now);
    }
}
9
ответ дан 4 December 2019 в 09:37
поделиться

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

4
ответ дан 4 December 2019 в 09:37
поделиться

Я вижу только 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 файл

2
ответ дан 4 December 2019 в 09:37
поделиться

Кажется, вы можете реализовать собственный фильтр как обычно (и наследовать AuthorizeAttribute, если хотите), а затем создать новый ActionInvoker, который наследует ControllerActionInvoker и переопределяет GetFilters. В GetFilters вы вызываете base.GetFilters () для получения списка фильтров, выполняете итерацию по AuthorizationFilters и заменяете вызовы AuthorizeFilter на вызовы вашего настраиваемого фильтра.

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

1
ответ дан 4 December 2019 в 09:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: