Programiranje

Izvedite overjanje HTTP v spletnem API-ju

V tem članku bi predstavil razpravo o izvajanju overjanja HTTP v spletnem API-ju. Obstajata dva načina, na katere lahko v svojem spletnem Api izvedete overjanje HTTP. Tej vključujejo:

  • Obrazci preverjajo pristnost
  • Osnovno preverjanje pristnosti

Preverjanja pristnosti sistema Windows ne bi šteli za izvedljivo strategijo, saj svoje storitve ne morete izpostaviti prek interneta, če uporabljate preverjanje pristnosti sistema Windows.

Zaščita spletnega API-ja z avtentikacijo obrazcev

Preverjanje pristnosti obrazcev uporablja ponudnika članstva ASP.Net in namesto glave avtorizacije uporablja standardne piškotke HTTP. Preverjanje pristnosti obrazcev ni tako prijazno REST-u, saj uporablja piškotke, stranke pa bi morale upravljati piškotke, da bi uporabljale storitve, ki izkoriščajo preverjanje pristnosti obrazcev, kar je ranljivo za napade ponarejanja med spletnimi mesti. Zato bi morali uporabiti ukrepe CSRF, če uporabljate preverjanje pristnosti obrazcev. Preverjanje pristnosti obrazcev ne uporablja šifriranja za zaščito poverilnic uporabnika. To torej ni varna strategija, če spletnega API-ja ne zaženete prek SSL-ja.

Zaščitite spletni API z uporabo osnovne overitve

Osnovno preverjanje pristnosti pošlje uporabnikove poverilnice v navadnem besedilu po žici. Če bi uporabljali osnovno preverjanje pristnosti, bi morali uporabiti svoj spletni API prek zaščitene vtičnice (SSL). Ko uporabljamo osnovno preverjanje pristnosti, bi v glavo zahteve HTTP predali uporabniške poverilnice ali žeton za preverjanje pristnosti. Storitev na strani strežnika bi morala razčleniti glavo, da bi pridobila žeton za preverjanje pristnosti. Če zahteva ni veljavna, strežnik vrne HTTP 401, kar pomeni nepooblaščen odgovor.

Raziščimo, kako lahko izvedemo osnovno preverjanje pristnosti z uporabo akcijskega filtra. Če želite to narediti, morate ustvariti razred, ki izpelje System.Web.Http.Filters.ActionFilterAttribute razred, kot je prikazano spodaj:

javni razred BasicAuthenticationAttribute: System.Web.Http.Filters.ActionFilterAttribute

    {

private Boolean IsUserValid (poverilnice slovarja)

        {

if (poverilnice ["UserName"]. Enako ("joydip") && poverilnice ["Password"]. Enako ("joydip123"))

vrni res;

vrni false;

        }

zasebni slovar ParseRequestHeaders (System.Web.Http.Controllers.HttpActionContext actionContext)

        {

Poverilnice slovarja = new Dictionary ();

var httpRequestHeader = actionContext.Request.Headers.GetValues ​​("Pooblastilo"). FirstOrDefault ();

httpRequestHeader = httpRequestHeader.Substring ("Pooblastilo" .Dolžina);

string [] httpRequestHeaderValues ​​= httpRequestHeader.Split (':');

niz uporabniško ime = Encoding.UTF8.GetString (Convert.FromBase64String (httpRequestHeaderValues ​​[0]));

niz gesla = Encoding.UTF8.GetString (Convert.FromBase64String (httpRequestHeaderValues ​​[1]));

poverilnice.Add ("UserName", uporabniško ime);

poverilnice.Add ("Geslo", geslo);

vrnitev poverilnic;

        }

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

        {

poskusite

            {

če (actionContext.Request.Headers.Authorization == null)

                {

actionContext.Response = novo System.Net.Http.HttpResponseMessage (System.Net.HttpStatusCode.Unauthorized);

                }

drugače

                {

Poverilnice slovarja = ParseRequestHeaders (actionContext);

                     if (IsUserValid (poverilnice))

actionContext.Response = novo System.Net.Http.HttpResponseMessage (System.Net.HttpStatusCode.OK);

drugače

actionContext.Response = novo System.Net.Http.HttpResponseMessage (System.Net.HttpStatusCode.Unauthorized);

                 }

            }

ulov

            {

actionContext.Response = novo System.Net.Http.HttpResponseMessage

(System.Net.HttpStatusCode.InternalServerError);

            }

        }

    }

Preverimo, ali je prisotna glava avtorizacije; v nasprotnem primeru se vrne odgovor HTTP 401 ali "nepooblaščen".

Naslednji korak je potrditev uporabniških poverilnic, ki jih odjemalca posredujejo prek glave zahteve za avtorizacijo. Preden to storimo, bi morali vedeti, kako kliče spletni API, ki ga kliče stranka. Za to sem pripravil testno metodo. Preskusna metoda uporablja HttpClient razred za klic spletnega API-ja. Upoštevajte, da se uporabniška imena pred predajo pretvorijo v format niza Base64. Preskusna metoda je navedena spodaj.

[TestMethod]

javna void BasicAuthenticationTest ()

        {

niz uporabniško ime = Convert.ToBase64String (Encoding.UTF8.GetBytes ("joydip"));

niz gesla = Convert.ToBase64String (Encoding.UTF8.GetBytes ("joydip123"));

Odjemalec HttpClient = nov HttpClient ();

client.DefaultRequestHeaders.Authorization = novo AuthenticationHeaderValue ("Autorizacija", uporabniško ime + ":" + geslo);

var rezultat = client.GetAsync (nov Uri ("// localhost // api / default /")). Rezultat;

Assert.IsTrue (result.IsSuccessStatusCode);

        }

Kot lahko vidite v zgornjem delčku kode, se uporabniške poverilnice posredujejo z glavo pooblastila.

Zdaj, ko je stranka pripravljena, dokončajmo izvajanje BasicAuthenicationFilter razred. Znotraj OnActionExecuting metodo bi morali razčleniti vrednost glave v tem razredu in preveriti, ali se poverilnice, dobavljene od odjemalca, ujemajo. Za zdaj predpostavimo, da imata uporabniško ime in geslo vrednosti joydip in joydip123, oziroma so trdno kodirani. Tu je celotna koda BasicAuthenticationFilter razred, ki vključuje preverjanje veljavnosti uporabniških poverilnic.

javni razred BasicAuthenticationAttribute: System.Web.Http.Filters.ActionFilterAttribute

    {

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

        {

poskusite

            {

če (actionContext.Request.Headers.Authorization == null)

                {

actionContext.Response = novo System.Net.Http.HttpResponseMessage (System.Net.HttpStatusCode.Unauthorized);

                }

drugače

                {

actionContext.Response = nova System.Net.Http.HttpResponseMessage (System.Net.HttpStatusCode.InternalServerError);

var httpRequestHeader = actionContext.Request.Headers.GetValues ​​("Pooblastilo"). FirstOrDefault ();

httpRequestHeader = httpRequestHeader.Substring ("Pooblastilo" .Dolžina);

string [] httpRequestHeaderValues ​​= httpRequestHeader.Split (':');

niz uporabniško ime = Encoding.UTF8.GetString (Convert.FromBase64String (httpRequestHeaderValues ​​[0]));

niz gesla = Encoding.UTF8.GetString (Convert.FromBase64String (httpRequestHeaderValues ​​[1]));

if (uporabniško ime.Equals ("joydip") && password.Equals ("joydip123"))

actionContext.Response = novo System.Net.Http.HttpResponseMessage (System.Net.HttpStatusCode.OK);

drugače

actionContext.Response = novo System.Net.Http.HttpResponseMessage (System.Net.HttpStatusCode.Unauthorized);

                }

            }

ulov

            {

actionContext.Response = nova System.Net.Http.HttpResponseMessage (System.Net.HttpStatusCode.InternalServerError);

            }

        }

    }

V razredu krmilnika morate atribut ustrezno določiti. Upoštevajte, da BasicAuthentication atribut tukaj se nanaša na BasicAuthenticationAttribute razred smo izvedli.

    [BasicAuthentication]

javni razred DefaultController: ApiController

    {

javni IEnumerable Get ()

        {

vrni nov niz [] {"Joydip", "Kanjilal"};

        }

    }

Zdaj, malo konfiguracije - atribut morate konfigurirati tako, da bodo klici vašega krmilnika ustrezno filtrirani, da bo preverjanje pristnosti delovalo.

 javni statični razred WebApiConfig

    {

javni statični void Register (HttpConfiguration config)

        {

config.MapHttpAttributeRoutes ();

config.Routes.MapHttpRoute (

ime: "DefaultApi",

routeTemplate: "api / {krmilnik} / {id}",

privzeto: novo {id = RouteParameter.O optional}

            );

config.Formatters.Remove (config.Formatters.XmlFormatter);

GlobalConfiguration.Configuration.Filters.Add (novo BasicAuthenticationAttribute ());

        }

    }

In končali ste! Ko zaženete testni primer, test prestane.

Vseeno morate zagotoviti, da poverilnice niso trdno kodirane; namesto tega jih je treba shraniti v bazo podatkov, vi pa jih morate pridobiti in potrditi v OnActionExecuting metoda BasicAuthenticationAttribute razred.

$config[zx-auto] not found$config[zx-overlay] not found