Для целых чисел без знака просто проверьте, что результат меньше, чем один из аргументов:
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
}
Да, взгляните на документы 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 () более ограничен в отношении информации, к которой вы можете получить доступ, а также результата, который вы можете вернуть,
Вы можете создать подкласс фильтра 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);
}
}
Внедрите своего собственного поставщика ролей и настройте приложение на его использование. Тогда атрибут авторизации будет учитывать ваш код авторизации.
Я вижу только 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 файл
Кажется, вы можете реализовать собственный фильтр как обычно (и наследовать AuthorizeAttribute, если хотите), а затем создать новый ActionInvoker, который наследует ControllerActionInvoker и переопределяет GetFilters. В GetFilters вы вызываете base.GetFilters ()
для получения списка фильтров, выполняете итерацию по AuthorizationFilters и заменяете вызовы AuthorizeFilter на вызовы вашего настраиваемого фильтра.
Другой потенциальный способ - реализовать настраиваемый фильтр. поставщиков членства и ролей, в зависимости от того, что вы пытаетесь сделать.