Programovanie

Implementujte autentifikáciu HTTP do webového API

V tomto článku by som predstavil diskusiu o implementácii autentifikácie HTTP vo webovom API. Existujú dva spôsoby, ako môžete implementovať autentifikáciu HTTP vo vašom Web Api. Tie obsahujú:

  • Overovanie formulárov
  • Základné overovanie

Autentizáciu systému Windows by sme nepovažovali za uskutočniteľnú stratégiu, pretože ak využijete autentifikáciu systému Windows, nemôžete odhaliť svoje služby cez internet.

Zabezpečenie Web Api pomocou autentifikácie formulárov

Overovanie formulárov využíva poskytovateľa členstva ASP.Net a namiesto hlavičky autorizácie používa štandardné súbory cookie HTTP. Overovanie formulárov nie je také vhodné pre REST, pretože používa súbory cookie, a klienti by tak museli spravovať súbory cookie, aby využívali služby využívajúce výhody autentifikácie formulárov, ktorá je zraniteľná voči útokom sfalšovaným medzi servermi. To je dôvod, prečo by ste museli implementovať opatrenia CSRF, ak používate autentifikáciu formulárov. Autentifikácia formulárov nepoužíva šifrovanie na zabezpečenie prihlasovacích údajov používateľa. Toto teda nie je bezpečná stratégia, pokiaľ svoje webové rozhranie API nespúšťate cez SSL.

Zabezpečené webové API pomocou základného overenia

Základné overenie odošle poverenie používateľa v textovom návode cez sieť. Ak chcete použiť základné overenie, mali by ste svoje webové rozhranie API používať cez vrstvu SSL (Secure Socket Layer). Pri použití základného overenia by sme odovzdali poverenia používateľa alebo overovací token v hlavičke požiadavky HTTP. Služba na strane servera bude musieť na získanie autentifikačného tokenu analyzovať hlavičku. Ak požiadavka nie je platná, server vráti HTTP 401, čo znamená neoprávnenú odpoveď.

Poďme preskúmať, ako môžeme vykonať základné overovanie pomocou filtra akcií. Aby ste to dosiahli, mali by ste vytvoriť triedu, ktorá odvodzuje System.Web.Http.Filters.ActionFilterAttribute trieda, ako je uvedené nižšie:

verejná trieda BasicAuthenticationAttribute: System.Web.Http.Filters.ActionFilterAttribute

    {

private Boolean IsUserValid (poverenia slovníka)

        {

if (poverenia ["UserName"]. Rovná sa ("joydip") && poverenia ["Heslo"]. Rovná sa ("joydip123"))

návrat pravdivý;

návrat nepravdivý;

        }

súkromný slovník ParseRequestHeaders (System.Web.Http.Controllers.HttpActionContext actionContext)

        {

Poverenia slovníka = nový slovník ();

var httpRequestHeader = actionContext.Request.Headers.GetValues ​​("Autorizácia"). FirstOrDefault ();

httpRequestHeader = httpRequestHeader.Substring ("Autorizácia" .Dĺžka);

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

string username = Encoding.UTF8.GetString (Convert.FromBase64String (httpRequestHeaderValues ​​[0]));

string password = Encoding.UTF8.GetString (Convert.FromBase64String (httpRequestHeaderValues ​​[1]));

credentials.Add ("UserName", meno používateľa);

credentials.Add ("Heslo", heslo);

vrátiť poverenia;

        }

verejné prepísanie void OnActionExecuting (System.Web.Http.Controllers.HttpActionContext actionContext)

        {

skús

            {

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

                {

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

                }

inak

                {

Poverenia slovníka = ParseRequestHeaders (actionContext);

                     if (IsUserValid (poverenia))

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

inak

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

                 }

            }

chytiť

            {

actionContext.Response = nový System.Net.Http.HttpResponseMessage

(System.Net.HttpStatusCode.InternalServerError);

            }

        }

    }

Skontrolujeme, či je k dispozícii autorizačná hlavička; ak nie, vráti sa odpoveď HTTP 401 alebo „neoprávnená“.

Ďalším krokom je overenie používateľských poverení odovzdaných prostredníctvom hlavičky žiadosti o autorizáciu od klienta. Skôr ako to urobíme, mali by sme vedieť, ako sa má volať webové rozhranie API od klienta. Na tento účel som pripravil testovaciu metódu. Skúšobná metóda používa HttpClient triedy na volanie Web API. Upozorňujeme, že používateľské mená sa pred odovzdaním prevedú do formátu reťazca Base64. Skúšobná metóda je uvedená nižšie.

[Testovacia metóda]

public void BasicAuthenticationTest ()

        {

string username = Convert.ToBase64String (Encoding.UTF8.GetBytes ("joydip"));

string password = Convert.ToBase64String (Encoding.UTF8.GetBytes ("joydip123"));

HttpClient klient = nový HttpClient ();

client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue ("Autorizácia", používateľské meno + ":" + heslo);

var result = client.GetAsync (new Uri ("// localhost // api / default /")). Výsledok;

Assert.IsTrue (result.IsSuccessStatusCode);

        }

Ako vidíte vo vyššie uvedenom útržku kódu, poverenia používateľa sa odovzdávajú pomocou autorizačnej hlavičky.

Teraz, keď je klient pripravený, dokončime implementáciu BasicAuthenicationFilter trieda. Vnútri OnActionExecuting Metóda, ktorú by sme potrebovali analyzovať hodnotu hlavičky v tejto triede a skontrolovať, či sa zhodujú poverenia poskytnuté od klienta. Zatiaľ predpokladajme, že meno používateľa a heslo má hodnoty joydip a joydip123(sú pevne zakódované). Tu je kompletný kód súboru BasicAuthenticationFilter trieda, ktorá obsahuje overenie prihlasovacích údajov používateľa.

verejná trieda BasicAuthenticationAttribute: System.Web.Http.Filters.ActionFilterAttribute

    {

verejné prepísanie void OnActionExecuting (System.Web.Http.Controllers.HttpActionContext actionContext)

        {

skús

            {

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

                {

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

                }

inak

                {

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

var httpRequestHeader = actionContext.Request.Headers.GetValues ​​("Autorizácia"). FirstOrDefault ();

httpRequestHeader = httpRequestHeader.Substring ("Autorizácia" .Dĺžka);

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

string username = Encoding.UTF8.GetString (Convert.FromBase64String (httpRequestHeaderValues ​​[0]));

string password = Encoding.UTF8.GetString (Convert.FromBase64String (httpRequestHeaderValues ​​[1]));

if (username.Equals ("joydip") && heslo.Equals ("joydip123"))

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

inak

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

                }

            }

chytiť

            {

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

            }

        }

    }

Vo svojej triede ovládačov by ste mali príslušne určiť atribút. Všimnite si, že Základné overenie atribút tu odkazuje na BasicAuthenticationAttribute triedy, ktorú sme implementovali.

    [BasicAuthentication]

verejná trieda DefaultController: ApiController

    {

verejné IEnumerable Get ()

        {

vrátiť nový reťazec [] {"Joydip", "Kanjilal"};

        }

    }

Teraz trochu konfigurácie --- musíte nakonfigurovať atribút tak, aby boli hovory na váš radič vhodne filtrované, aby autentifikácia fungovala.

 verejná statická trieda WebApiConfig

    {

verejný statický neplatný register (konfigurácia HttpConfiguration)

        {

config.MapHttpAttributeRoutes ();

config.Routes.MapHttpRoute (

názov: "DefaultApi",

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

predvolené hodnoty: new {id = RouteParameter.Optional}

            );

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

GlobalConfiguration.Configuration.Filters.Add (nový BasicAuthenticationAttribute ());

        }

    }

A ste hotoví! Po vykonaní testovacieho prípadu test prejde.

Každopádne by ste sa mali ubezpečiť, že poverenia nie sú pevne napísané; skôr by mali byť uložené v databáze a mali by ste ich vyhľadať a overiť v OnActionExecuting metóda BasicAuthenticationAttribute trieda.

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