Как да защитим уеб API на ASP.Net с помощта на филтри за оторизация

Сигурността е основна грижа в уеб-базирани корпоративни приложения. Когато трябва да предавате данни по проводника, трябва да сте наясно с различните инструменти, които можете да използвате, за да защитите тези данни.

ASP.Net Web API е лека рамка, използвана за изграждане на RESTful услуги без гражданство, работещи на HTTP. Един от начините да защитите услугите на уеб API е чрез филтри за оторизация.

В идеалния случай трябва да извършите удостоверяване и упълномощаване в началото на конвейера на Web API. Това помага да се елиминират ненужните допълнителни разходи за обработка от цикъла на заявките. Имайте предвид, че независимо дали използвате HTTP модули или HTTP манипулатори на съобщения за удостоверяване, можете да извлечете текущия принципал (т.е. потребителя) от ApiController.Userсвойството.

Също така имайте предвид, че филтрите за оторизация на Web API се изпълняват преди методите за действие на контролера. Така че, ако входящата заявка не бъде упълномощена, грешката ще бъде върната от услугата, заявката ще бъде игнорирана и методът на действие на услугата няма да бъде изпълнен.

Използване на авторизационен филтър AuthorizeAttribute

Вграденият филтър за оторизация AuthorizeAttributeможе да се използва за разрешаване на входящи заявки. Можете да използвате, за  AuthorizeAttribute да проверите дали потребителят е удостоверен. Ако потребителят не е удостоверен, той ще върне HTTP кода на състоянието 401. Това упълномощаване може да се приложи в уеб API глобално или на ниво контролер.

Имайте предвид, че можете също да внедрите персонализиран манипулатор на съобщения, за да разрешите достъп до вашите методи на контролера, тъй като филтрите за съобщения се изпълняват много по-рано в жизнения цикъл на уеб API.

За да ограничите достъпа до всички контролери, можете да добавите AuthorizeAttributeглобално към Filtersколекцията на HttpConfigurationекземпляра. Следният кодов фрагмент показва как можете да добавите AuthorizeAttributeв Filtersколекцията на HttpConfigurationобекта.

public static void Register(HttpConfiguration config)

        {

            // Web API configuration and services 

            // Web API routes

            config.MapHttpAttributeRoutes(); 

            config.Routes.MapHttpRoute(

                name: “DefaultApi”,

                routeTemplate: “api/{controller}/{id}”,

                defaults: new { id = RouteParameter.Optional }

            ); 

            config.Filters.Add(new AuthorizeAttribute());

        } 

Използване на атрибута Authorize 

На ниво контролер можете да ограничите достъпа, като приложите Authorizeатрибута, както е показано в кодовия фрагмент, даден по-нататък.

[Authorize]

public class EmployeesController : ApiController

{

    //Write methods here that correspond to the Http verbs

}

Можете също да приложите Authorizeатрибута на ниво действие, за да ограничите достъпа до определен метод на действие. Следният кодов фрагмент илюстрира как това може да бъде приложено.

public class EmployeesController : ApiController

{

    public HttpResponseMessage Get() { //Some code }

   // Require authorization for a specific action.

    [Authorize]

    public HttpResponseMessage Post(Employee emp) { //Some code }

В кодовия фрагмент, показан по-рано, достъпът до Post()метода е ограничен, докато достъпът до Get()метода не е ограничен. Можете също така да ограничите контролера и след това да предоставите анонимен достъп до един или повече методи за действие. Кодовият фрагмент, който следва, илюстрира това.

public class EmployeesController : ApiController

{

    public HttpResponseMessage Get() { //Some code }

    [AllowAnonymous]

    public HttpResponseMessage Post(Employee emp) { //Some code }

}

Упълномощавайте действия по роли и потребители

Също така е възможно да се ограничи достъпът до методите за действие по роли и потребители. Следният кодов фрагмент показва как може да се постигне това.

[Authorize(Users="Joydip,Jini")] //Restrict access by user

public class EmployeesController : ApiController

{

   //Write methods here that correspond to the Http verbs

}

В горния пример контролерът Employees ограничава достъпа само до потребителите Joydip и Jini. Кодът по-долу показва как можете да ограничите достъпа по роли.

[Authorize(Roles="Administrators")] //Restrict by roles

public class EmployeesController : ApiController

{

    //Write methods here that correspond to the Http verbs

}

Винаги можете да получите достъп до ApiController.Userсвойството в метода на контролера, за да извлечете текущия принцип и да предоставите упълномощаване въз основа на ролята на потребителя. Това е показано в списъка с кодове по-долу.

public HttpResponseMessage Get()

{

    if (User.IsInRole(“Administrators”))

    {

        //Write your code here

    }

}

Използване на персонализирани филтри за оторизация в ASP.Net Web API

Филтърът за оторизация е клас, който разширява AuthorizationFilterAttributeкласа и замества OnAuthorization()метода. Това е методът, при който можете да напишете логиката за оторизация. Ако оторизацията не успее, можете да върнете екземпляр на UnauthorizedExceptionкласа или дори потребителски HttpResponseMessage.

Следният списък с кодове показва как можете да внедрите персонализиран клас за оторизиране на заявки към вашия уеб API. Имайте предвид, че трябва да разширите AuthorizeAttributeкласа, за да приложите свой собствен клас на филтър за оторизация.

public class CustomAuthorizeAttribute : AuthorizeAttribute

    {

         public override void OnAuthorization(System.Web.Http.Controllers.HttpActionContext actionContext)

        {

            if (AuthorizeRequest(actionContext))

            {

                return;

            }

            HandleUnauthorizedRequest(actionContext);

        }

        protected override void HandleUnauthorizedRequest(System.Web.Http.Controllers.HttpActionContext actionContext)

        {

           //Code to handle unauthorized request

        }

        private bool AuthorizeRequest(System.Web.Http.Controllers.HttpActionContext actionContext)

        {

            //Write your code here to perform authorization

            return true;

        }

    }