Programmering

Implementere HTTP-godkendelse i Web API

I denne artikel vil jeg præsentere en diskussion om implementering af HTTP-godkendelse i Web API. Der er to måder, hvorpå du kan implementere HTTP-godkendelse i din Web Api. Disse inkluderer:

  • Formulargodkendelse
  • Grundlæggende godkendelse

Vi betragter ikke Windows-godkendelse som en gennemførlig strategi, da du ikke kan udsætte din tjeneste over Internettet, hvis du udnytter Windows-godkendelse.

Sikring af Web Api ved hjælp af formulargodkendelse

Formulargodkendelse bruger ASP.Net-medlemsudbyderen og bruger standard HTTP-cookies i stedet for autorisationsoverskriften. Formulargodkendelse er ikke så REST-venlig, da den bruger cookies, og klienterne skal styre cookies for at forbruge tjenester, der udnytter formulargodkendelse, som er sårbar over for falske angreb på tværs af websteder. Dette er grunden til, at du bliver nødt til at implementere CSRF-foranstaltninger, hvis du bruger formulargodkendelse. Formulargodkendelse bruger ikke kryptering til at sikre brugerens legitimationsoplysninger. Derfor er dette ikke en sikker strategi, medmindre du kører din Web API over SSL.

Sikker web-API ved hjælp af grundlæggende godkendelse

Grundlæggende godkendelse sender brugerens legitimationsoplysninger i reklametekst over ledningen. Hvis du bruger grundlæggende godkendelse, skal du bruge din Web API over et Secure Socket Layer (SSL). Når du bruger grundlæggende godkendelse, sender vi brugerens legitimationsoplysninger eller godkendelsestokenet i overskriften på HTTP-anmodningen. Tjenesten på serversiden skal analysere overskriften for at hente godkendelsestokenet. Hvis anmodningen ikke er en gyldig anmodning, returnerer serveren HTTP 401, hvilket betyder et uautoriseret svar.

Lad os undersøge, hvordan vi kan udføre grundlæggende godkendelse ved hjælp af et handlingsfilter. For at gøre dette skal du oprette en klasse, der stammer fra System.Web.Http.Filters.ActionFilterAttribute klasse som vist nedenfor:

offentlig klasse BasicAuthenticationAttribute: System.Web.Http.Filters.ActionFilterAttribute

    {

private boolske IsUserValid (ordbog legitimationsoplysninger)

        {

hvis (legitimationsoplysninger ["Brugernavn"]. Lig med ("joydip") && legitimationsoplysninger ["Adgangskode"]. Lig med ("joydip123"))

returner sandt;

returner falsk;

        }

privat ordbog ParseRequestHeaders (System.Web.Http.Controllers.HttpActionContext actionContext)

        {

Ordbogens legitimationsoplysninger = ny ordbog ();

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

httpRequestHeader = httpRequestHeader.Substring ("Autorisation" .Længde);

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

streng brugernavn = kodning.UTF8.GetString (Convert.FromBase64String (httpRequestHeaderValues ​​[0]));

strengadgangskode = Kodning.UTF8.GetString (Convert.FromBase64String (httpRequestHeaderValues ​​[1]));

legitimationsoplysninger.Add ("Brugernavn", brugernavn);

credentials.Add ("Adgangskode", adgangskode);

returnere legitimationsoplysninger

        }

offentlig tilsidesættelse ugyldig OnActionExecuting (System.Web.Http.Controllers.HttpActionContext actionContext)

        {

prøve

            {

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

                {

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

                }

andet

                {

Ordbogens legitimationsoplysninger = ParseRequestHeaders (actionContext);

                     hvis (IsUserValid (legitimationsoplysninger))

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

andet

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

                 }

            }

fangst

            {

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

(System.Net.HttpStatusCode.InternalServerError);

            }

        }

    }

Vi kontrollerer, om autorisationsoverskriften er til stede; hvis ikke, returneres et HTTP 401- eller "uautoriseret" svar.

Det næste trin er at validere de brugerlegitimationsoplysninger, der sendes via headeren fra autorisationsanmodningen fra klienten. Før vi gør det, skal vi vide, hvordan Web API skal kaldes fra klienten. Til dette har jeg udarbejdet en testmetode. Testmetoden bruger HttpClient klasse for at kalde Web API. Bemærk, at brugernavne konverteres til Base64-strengformat, før de sendes. Testmetoden er angivet nedenfor.

[Testmetode]

offentlig ugyldig BasicAuthenticationTest ()

        {

streng brugernavn = Convert.ToBase64String (Encoding.UTF8.GetBytes ("joydip"));

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

HttpClient-klient = ny HttpClient ();

client.DefaultRequestHeaders.Authorization = ny AuthenticationHeaderValue ("Autorisation", brugernavn + ":" + adgangskode);

var result = client.GetAsync (ny Uri ("// localhost // api / default /")) Resultat;

Assert.IsTrue (result.IsSuccessStatusCode);

        }

Som du kan se i ovenstående kodestykke, sendes brugeroplysningerne ved hjælp af autorisationsoverskriften.

Nu hvor klienten er klar, lad os gennemføre implementeringen af BasicAuthenicationFilter klasse. Inde i OnActionExecuting metode, vi bliver nødt til at analysere headerværdien i denne klasse og kontrollere, om de legitimationsoplysninger, der leveres fra klienten, matcher. Lad os nu antage, at brugernavnet og adgangskoden har værdier på joydip og joydip123, henholdsvis (de er hårdkodede). Her er den komplette kode for BasicAuthenticationFilter klasse, der inkorporerer validering af brugeroplysningerne.

offentlig klasse BasicAuthenticationAttribute: System.Web.Http.Filters.ActionFilterAttribute

    {

offentlig tilsidesættelse ugyldig OnActionExecuting (System.Web.Http.Controllers.HttpActionContext actionContext)

        {

prøve

            {

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

                {

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

                }

andet

                {

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

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

httpRequestHeader = httpRequestHeader.Substring ("Autorisation" .Længde);

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

streng brugernavn = kodning.UTF8.GetString (Convert.FromBase64String (httpRequestHeaderValues ​​[0]));

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

hvis (brugernavn.Equals ("joydip") && password.Equals ("joydip123"))

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

andet

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

                }

            }

fangst

            {

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

            }

        }

    }

I din controller-klasse skal du specificere attributten korrekt. Bemærk, at Grundlæggende godkendelse attribut her henviser til BasicAuthenticationAttribute klasse, vi implementerede.

    [BasicAuthentication]

offentlig klasse DefaultController: ApiController

    {

offentlig IEnumerable Get ()

        {

returner ny streng [] {"Joydip", "Kanjilal"};

        }

    }

Nu, en smule konfiguration --- du skal konfigurere attributten, så opkald til din controller vil blive filtreret korrekt, så godkendelsen fungerer.

 offentlig statisk klasse WebApiConfig

    {

offentligt statisk ugyldigt register (HttpConfiguration config)

        {

config.MapHttpAttributeRoutes ();

config.Routes.MapHttpRoute (

navn: "StandardApi",

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

standardindstillinger: ny {id = RouteParameter.Optional}

            );

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

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

        }

    }

Og du er færdig! Når du udfører testsagen, består testen.

Du skal alligevel sikre dig, at legitimationsoplysningerne ikke er hårdkodede; snarere skal de gemmes i en database, og du skal hente dem og validere i OnActionExecuting metode til BasicAuthenticationAttribute klasse.

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