Programavimas

Įdiegti HTTP autentifikavimą žiniatinklio API

Šiame straipsnyje pristatysiu diskusiją apie HTTP autentifikavimo diegimą žiniatinklio API. Yra du būdai, kuriais galite įdiegti HTTP autentifikavimą savo žiniatinklio programoje. Jie apima:

  • Formų autentifikavimas
  • Pagrindinis autentifikavimas

„Windows“ autentifikavimo nelaikytume įgyvendinama strategija, nes negalite atskleisti savo paslaugos internete, jei naudosite „Windows“ autentifikavimą.

„Web API“ apsauga naudojant „Forms Authentication“

Formų autentifikavimas naudoja ASP.Net narystės teikėją ir vietoj Įgaliojimo antraštės naudoja standartinius HTTP slapukus. Formų autentifikavimas nėra toks REST patogus, nes jame naudojami slapukai, o klientams reikėtų valdyti slapukus, kad būtų galima naudoti paslaugas, kurios naudojasi formų autentifikavimo pranašumais, kurie yra pažeidžiami kelių svetainių klastojimo atakų. Štai kodėl jums reikės įgyvendinti CSRF priemones, jei naudojate formų autentifikavimą. Formų autentifikavimas nenaudoja šifravimo, kad apsaugotų vartotojo kredencialus. Taigi, tai nėra saugi strategija, nebent paleisite savo žiniatinklio API naudodami SSL.

Saugus žiniatinklio API naudojant pagrindinį autentifikavimą

Pagrindinis autentifikavimas siunčia vartotojo kredencialus paprastu tekstu per laidą. Jei naudojote pagrindinį autentifikavimą, turėtumėte naudoti savo žiniatinklio API per „Secure Socket Layer“ (SSL). Naudodami pagrindinį autentifikavimą, mes perduotume vartotojo prisijungimo duomenis arba autentifikavimo žetoną HTTP užklausos antraštėje. Serverio pusėje esančiai tarnybai reikės išanalizuoti antraštę, kad būtų galima gauti autentifikavimo prieigos raktą. Jei užklausa nėra teisinga užklausa, serveris pateikia HTTP 401, o tai reiškia neteisėtą atsakymą.

Panagrinėkime, kaip galime atlikti pagrindinį autentifikavimą naudodami veiksmų filtrą. Norėdami tai padaryti, turėtumėte sukurti klasę, kuri išvestų System.Web.Http.Filters.ActionFilterAttribute klasė, kaip parodyta žemiau:

public class BasicAuthenticationAttribute: System.Web.Http.Filters.ActionFilterAttribute

    {

privatus loginis „IsUserValid“ (žodyno kredencialai)

        {

jei (prisijungimo duomenys ["Vartotojo vardas"]. Lygus ("joydip") ir& prisijungimo duomenys ["Slaptažodis"]. Lygus ("joydip123"))

grįžti tiesa;

grąžinti klaidingą;

        }

privatus žodynas „ParseRequestHeaders“ (System.Web.Http.Controllers.HttpActionContext actionContext)

        {

Žodyno duomenys = naujas žodynas ();

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

httpRequestHeader = httpRequestHeader.Substring ("Įgaliojimas". Ilgis);

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

eilutės naudotojo vardas = Encoding.UTF8.GetString (Convert.FromBase64String (httpRequestHeaderValues ​​[0]));

eilutės slaptažodis = Encoding.UTF8.GetString (Convert.FromBase64String (httpRequestHeaderValues ​​[1]));

įgaliojimai.Add („Vartotojo vardas“, vartotojo vardas);

įgaliojimai.Add („Slaptažodis“, slaptažodis);

grąžinimo įgaliojimai;

        }

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

        {

bandyti

            {

jei (actionContext.Request.Headers.Authorization == null)

                {

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

                }

Kitas

                {

Žodyno duomenys = ParseRequestHeaders (actionContext);

                     jei (IsUserValid (prisijungimo duomenys))

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

Kitas

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

                 }

            }

pagauti

            {

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

(„System.Net.HttpStatusCode.InternalServerError“);

            }

        }

    }

Mes patikriname, ar yra autorizacijos antraštė; jei ne, grąžinamas HTTP 401 arba „neteisėtas“ atsakymas.

Kitas žingsnis yra patvirtinti vartotojo kredencialus, perduotus per kliento įgaliojimo užklausos antraštę. Prieš tai atlikdami turėtume žinoti, kaip iš kliento reikia iškviesti žiniatinklio API. Tam paruošiau bandymo metodą. Bandymo metodas naudoja HttpClient klasę paskambinti žiniatinklio API. Atkreipkite dėmesį, kad vartotojo vardai yra konvertuojami į „Base64“ eilutės formatą prieš juos perduodant. Bandymo metodas pateiktas žemiau.

[Bandymo metodas]

public void „BasicAuthenticationTest“ ()

        {

eilutės naudotojo vardas = Convert.ToBase64String (Encoding.UTF8.GetBytes ("joydip"));

eilutės slaptažodis = Convert.ToBase64String (Encoding.UTF8.GetBytes ("joydip123"));

„HttpClient“ klientas = naujas „HttpClient“ ();

client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue ("Įgaliojimas", vartotojo vardas + ":" + slaptažodis);

var rezultatas = klientas.GetAsync (naujas URI ("// localhost // api / default /")). Rezultatas;

„Assert.IsTrue“ (rezultatas.IsSuccessStatusCode);

        }

Kaip matote aukščiau pateiktame kodo fragmente, vartotojo kredencialai perduodami naudojant įgaliojimo antraštę.

Dabar, kai klientas yra pasirengęs, baigsime diegti „BasicAuthenicationFilter“ klasė. Viduje OnActionExecuting metodo mums reikės išanalizuoti šios klasės antraštės vertę ir patikrinti, ar sutampa kliento pateikti kredencialai. Tarkime, kad vartotojo vardo ir slaptažodžio reikšmės yra džiaugsmas ir 123, atitinkamai (jie yra užkoduoti). Čia yra visas „BasicAuthenticationFilter“ klasė, apimanti vartotojo kredencialų patvirtinimą.

public class BasicAuthenticationAttribute: System.Web.Http.Filters.ActionFilterAttribute

    {

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

        {

bandyti

            {

jei (actionContext.Request.Headers.Authorization == null)

                {

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

                }

Kitas

                {

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

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

httpRequestHeader = httpRequestHeader.Substring ("Įgaliojimas". Ilgis);

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

eilutės naudotojo vardas = Encoding.UTF8.GetString (Convert.FromBase64String (httpRequestHeaderValues ​​[0]));

eilutės slaptažodis = Encoding.UTF8.GetString (Convert.FromBase64String (httpRequestHeaderValues ​​[1]));

if (vartotojo vardas.Equals ("joydip") && slaptažodis.Equals ("joydip123"))

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

Kitas

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

                }

            }

pagauti

            {

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

            }

        }

    }

Valdiklio klasėje turėtumėte tinkamai nurodyti atributą. Atkreipkite dėmesį, kad Pagrindinis autentifikavimas atributas čia nurodo „BasicAuthenticationAttribute“ klasę, kurią įgyvendinome.

    [Pagrindinė autentifikacija]

viešoji klasė DefaultController: ApiController

    {

public IEnumerable Get ()

        {

grąžinti naują eilutę [] {"Joydip", "Kanjilal"};

        }

    }

Šiek tiek konfigūracijos --- turite sukonfigūruoti atributą taip, kad skambučiai jūsų valdikliui būtų tinkamai filtruojami, kad autentifikavimas veiktų.

 viešoji statinė klasė „WebApiConfig“

    {

public static void Register („HttpConfiguration config“)

        {

config.MapHttpAttributeRoutes ();

config.Routes.MapHttpRoute (

pavadinimas: „DefaultApi“,

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

numatytieji parametrai: new {id = RouteParameter.Optional}

            );

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

„GlobalConfiguration.Configuration.Filters.Add“ (naujas „BasicAuthenticationAttribute“);

        }

    }

Ir jūs baigėte! Kai vykdote bandomąjį atvejį, testas praeina.

Bet kokiu atveju turėtumėte įsitikinti, kad įgaliojimai nėra užkoduoti; jie turėtų būti saugomi duomenų bazėje ir turėtumėte juos gauti ir patvirtinti „OnActionExecuting“ metodas „BasicAuthenticationAttribute“ klasė.

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