Programmēšana

Ievietojiet HTTP autentifikāciju Web API

Šajā rakstā es izklāstīšu diskusiju par HTTP autentifikācijas ieviešanu Web API. Ir divi veidi, kā savā Web API var ieviest HTTP autentifikāciju. Tie ietver:

  • Veido autentifikāciju
  • Pamata autentifikācija

Mēs neuzskatīsim Windows autentifikāciju par iespējamu stratēģiju, jo jūs nevarat pakļaut savu pakalpojumu internetam, ja izmantojat Windows autentifikāciju.

Tīmekļa api drošība, izmantojot veidlapu autentifikāciju

Veidlapu autentifikācija izmanto ASP.Net dalības nodrošinātāju un galvenās Autorizācijas vietā izmanto standarta HTTP sīkfailus. Veidlapu autentifikācija nav tik REST draudzīga, jo tajā tiek izmantoti sīkfaili, un klientiem būtu jāpārvalda sīkdatnes, lai patērētu pakalpojumus, kas izmanto veidlapu autentifikācijas priekšrocības, kuras ir neaizsargātas pret dažādu vietņu viltošanas uzbrukumiem. Tāpēc, ja izmantojat veidlapu autentifikāciju, jums būs jāievieš CSRF pasākumi. Veidlapu autentifikācija neizmanto šifrēšanu, lai aizsargātu lietotāja akreditācijas datus. Tādējādi šī nav droša stratēģija, ja vien Web API nedarbojat, izmantojot SSL.

Droša tīmekļa API, izmantojot pamata autentifikāciju

Pamata autentifikācija nosūta lietotāja akreditācijas datus sablīvētā tekstā pa vadu. Ja izmantojāt pamata autentifikāciju, jums jāizmanto Web API, izmantojot drošo ligzdu slāni (SSL). Izmantojot pamata autentifikāciju, mēs nosūtīsim lietotāja akreditācijas datus vai autentifikācijas marķieri HTTP pieprasījuma galvenē. Servera pusē esošajam pakalpojumam vajadzētu parsēt galveni, lai izgūtu autentifikācijas marķieri. Ja pieprasījums nav derīgs pieprasījums, serveris atgriež HTTP 401, kas nozīmē neatļautu atbildi.

Izpētīsim, kā mēs varam veikt pamata autentifikāciju, izmantojot darbību filtru. Lai to izdarītu, jums jāizveido klase, no kuras iegūst System.Web.Http.Filters.ActionFilterAttribute klase, kā parādīts zemāk:

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

    {

privātie Būla IsUserValid (vārdnīcas akreditācijas dati)

        {

ja (akreditācijas dati ["Lietotāja vārds"]. Vienāds ("joydip") un& akreditācijas dati ["Parole"]. Vienāds ("joydip123"))

atgriezties taisnība;

atgriezties nepatiesa;

        }

privātā vārdnīca ParseRequestHeaders (System.Web.Http.Controllers.HttpActionContext actionContext)

        {

Vārdnīcas akreditācijas dati = new Dictionary ();

var httpRequestHeader = actionContext.Request.Headers.GetValues ​​("Autorizācija"). FirstOrDefault ();

httpRequestHeader = httpRequestHeader.Substring ("Autorizācija" .Length);

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

virknes lietotājvārds = Encoding.UTF8.GetString (Convert.FromBase64String (httpRequestHeaderValues ​​[0]));

virknes parole = Encoding.UTF8.GetString (Convert.FromBase64String (httpRequestHeaderValues ​​[1]));

akreditācijas dati.Pievienot ("UserName", lietotājvārds);

akreditācijas dati.Add ("Parole", parole);

atgriešanās akreditācijas dati;

        }

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

        {

mēģiniet

            {

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

                {

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

                }

cits

                {

Vārdnīcas akreditācijas dati = ParseRequestHeaders (actionContext);

                     ja (IsUserValid (akreditācijas dati))

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

cits

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

                 }

            }

noķert

            {

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

(System.Net.HttpStatusCode.InternalServerError);

            }

        }

    }

Mēs pārbaudām, vai ir autorizācijas galvene; ja nē, tiek atgriezta atbilde HTTP 401 vai "neatļauta".

Nākamais solis ir apstiprināt lietotāja akreditācijas datus, kas nodoti, izmantojot klienta autorizācijas pieprasījuma galveni. Pirms to darām, mums jāzina, kā no klienta jāizsauc Web API. Šim nolūkam esmu sagatavojis testa metodi. Pārbaudes metodē izmanto HttpClient klases, lai izsauktu Web API. Ņemiet vērā, ka lietotāju vārdi pirms to nodošanas tiek pārveidoti par Base64 virknes formātu. Pārbaudes metode ir dota turpmāk.

[Pārbaudes metode]

public void BasicAuthenticationTest ()

        {

virknes lietotājvārds = Convert.ToBase64String (Encoding.UTF8.GetBytes ("joydip"));

virknes parole = Convert.ToBase64String (Encoding.UTF8.GetBytes ("joydip123"));

HttpClient klients = jauns HttpClient ();

client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue ("Autorizācija", lietotājvārds + ":" + parole);

var result = client.GetAsync (new Uri ("// localhost // api / default /")). Rezultāts;

Assert.IsTrue (result.IsSuccessStatusCode);

        }

Kā redzat iepriekš minētajā koda fragmentā, lietotāja akreditācijas dati tiek nodoti, izmantojot autorizācijas galveni.

Tagad, kad klients ir gatavs, pabeigsim programmas ieviešanu BasicAuthenicationFilter klasē. Iekšpusē OnActionExecuting metodi mums vajadzēs parsēt galvenes vērtību šajā klasē un pārbaudīt, vai klienta sniegtie akreditācijas dati sakrīt. Pagaidām pieņemsim, ka lietotāja vārdam un parolei ir vērtības joydip un 123, attiecīgi (tie ir kodēti). Šeit ir pilns programmas kods BasicAuthenticationFilter klase, kas ietver lietotāja akreditācijas datu validāciju.

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

    {

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

        {

mēģiniet

            {

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

                {

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

                }

cits

                {

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

var httpRequestHeader = actionContext.Request.Headers.GetValues ​​("Autorizācija"). FirstOrDefault ();

httpRequestHeader = httpRequestHeader.Substring ("Autorizācija" .Length);

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

virknes lietotājvārds = Encoding.UTF8.GetString (Convert.FromBase64String (httpRequestHeaderValues ​​[0]));

virknes parole = Encoding.UTF8.GetString (Convert.FromBase64String (httpRequestHeaderValues ​​[1]));

if (lietotājvārds.Equals ("joydip") && password.Equals ("joydip123"))

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

cits

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

                }

            }

noķert

            {

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

            }

        }

    }

Vadītāja klasē jums atbilstoši jānorāda atribūts. Ņemiet vērā, ka PamataAutentifikācija atribūts šeit attiecas uz BasicAuthenticationAttribute klase, kuru mēs īstenojām.

    [PamataAutentifikācija]

publiskā klase DefaultController: ApiController

    {

public IEnumerable Get ()

        {

atgriezt jaunu virkni [] {"Joydip", "Kanjilal"};

        }

    }

Tagad mazliet konfigurācijas --- jums jākonfigurē atribūts tā, lai zvani uz jūsu kontrolieri tiktu atbilstoši filtrēti, lai autentifikācija darbotos.

 publiskā statiskā klase WebApiConfig

    {

public static void Register (HttpConfiguration config)

        {

config.MapHttpAttributeRoutes ();

config.Routes.MapHttpRoute (

nosaukums: "DefaultApi",

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

noklusējumi: new {id = RouteParameter.Optional}

            );

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

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

        }

    }

Un jūs esat pabeidzis! Izpildot testa gadījumu, pārbaude iztur.

Jebkurā gadījumā jums jāpārliecinās, ka akreditācijas dati nav kodēti; drīzāk tie būtu jāuzglabā datu bāzē, un jums tie jāizgūst un jāapstiprina OnActionExecuting metode BasicAuthenticationAttribute klasē.

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