Ohjelmointi

Ota HTTP-todennus käyttöön Web-sovellusliittymässä

Tässä artikkelissa esitän keskustelun HTTP-todennuksen toteuttamisesta Web-sovellusliittymässä. HTTP-todennuksen voi toteuttaa Web-apissa kahdella tavalla. Nämä sisältävät:

  • Lomakkeiden todennus
  • Perustodennus

Emme pidä Windows-todennusta toteutettavissa olevana strategiana, koska et voi paljastaa palvelua Internetissä, jos hyödynnät Windows-todennusta.

Web-apin suojaaminen lomakkeiden todennuksella

Lomakkeiden todennus käyttää ASP.Net-jäsenyyden tarjoajaa ja käyttää tavallisia HTTP-evästeitä Valtuutus-otsikon sijaan. Lomakkeiden todennus ei ole niin REST-ystävällistä, koska se käyttää evästeitä, ja asiakkaiden on hallittava evästeitä, jotta ne voivat käyttää palveluita, jotka hyödyntävät lomakkeiden todentamista, joka on alttiita sivustojen välisille väärennöksille. Siksi sinun on toteutettava CSRF-toimenpiteet, jos käytät lomakkeiden todennusta. Lomakkeiden todennus ei käytä salausta käyttäjän tunnistetietojen suojaamiseen. Siksi tämä ei ole turvallinen strategia, ellet käytä Web-sovellusliittymääsi SSL: n kautta.

Suojattu Web-sovellusliittymä käyttäen perustodennusta

Perustodennus lähettää käyttäjän tunnistetiedot ruudullinen teksti langan yli. Jos haluat käyttää perustodennusta, sinun on käytettävä Web-sovellusliittymääsi suojatun socket-kerroksen (SSL) kautta. Käytettäessä perustodennusta välitettäisiin käyttäjän kirjautumistiedot tai todennustunnus HTTP-pyynnön otsikossa. Palvelinpuolen palvelun on jäsennettävä otsikko todentamistunnuksen noutamiseksi. Jos pyyntö ei ole kelvollinen pyyntö, palvelin palauttaa HTTP 401: n, mikä tarkoittaa luvatonta vastausta.

Tutkitaan, miten voimme suorittaa perustodennuksen toimintosuodattimen avulla. Tätä varten sinun tulisi luoda luokka, joka johtaa System.Web.Http.Filters.ActionFilterAttribute luokka alla olevan kuvan mukaisesti:

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

    {

yksityinen Boolen IsUserValid (sanakirjatiedot)

        {

if (tunnistetiedot ["Käyttäjänimi"]. Yhtä ("joydip") && tunnistetiedot ["Salasana"]. Yhtä ("joydip123"))

palaa tosi;

return false;

        }

yksityinen sanakirja ParseRequestHeaders (System.Web.Http.Controllers.HttpActionContext actionContext)

        {

Sanakirjatiedot = uusi sanakirja ();

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

httpRequestHeader = httpRequestHeader.Substring ("Valtuutus". Pituus);

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

merkkijono käyttäjänimi = Encoding.UTF8.GetString (Convert.FromBase64String (httpRequestHeaderValues ​​[0]));

merkkijonon salasana = Encoding.UTF8.GetString (Muunna.FromBase64String (httpRequestHeaderValues ​​[1]));

tunnistetiedot.Add ("Käyttäjänimi", käyttäjänimi);

tunnistetiedot.Add ("Salasana", salasana);

palautustiedot;

        }

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

        {

yrittää

            {

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

                {

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

                }

muu

                {

Sanakirjatiedot = ParseRequestHeaders (actionContext);

                     if (IsUserValid (tunnistetiedot))

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

muu

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

                 }

            }

saada kiinni

            {

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

(System.Net.HttpStatusCode.InternalServerError);

            }

        }

    }

Tarkistamme, onko valtuutusotsikko olemassa; jos ei, palautetaan HTTP 401 tai "luvaton" vastaus.

Seuraava vaihe on vahvistaa asiakkaan valtuutuspyyntöotsikon kautta välitetyt käyttäjätiedot. Ennen kuin teemme sen, meidän pitäisi tietää, miten Web-sovellusliittymä kutsutaan asiakkaalta. Tätä varten olen valmistanut testimenetelmän. Testimenetelmässä käytetään HttpClient luokan kutsua Web-sovellusliittymää. Huomaa, että käyttäjänimet muunnetaan Base64-merkkijonoformaatiksi ennen niiden välittämistä. Testimenetelmä on annettu alla.

[Testausmenetelmä]

public void BasicAuthenticationTest ()

        {

merkkijono käyttäjänimi = Convert.ToBase64String (Encoding.UTF8.GetBytes ("joydip"));

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

HttpClient-asiakas = uusi HttpClient ();

client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue ("Valtuutus", käyttäjänimi + ":" + salasana);

var result = asiakas.GetAsync (uusi Uri ("// paikallinen isäntä // api / oletus /")). Tulos;

Assert.IsTrue (result.IsSuccessStatusCode);

        }

Kuten yllä olevasta koodinpätkästä näet, käyttäjän tunnistetiedot välitetään valtuutusotsikon avulla.

Nyt kun asiakas on valmis, saatetaan päätökseen BasicAuthenicationFilter luokassa. Sisällä OnActionExecuting Menetelmässä meidän on jäsennettävä tämän luokan otsikkoarvo ja tarkistettava, vastaavatko asiakkaan toimittamat tunnistetiedot. Oletetaan toistaiseksi, että käyttäjänimen ja salasanan arvot ovat joydip ja joydip123vastaavasti (ne ovat kovakoodattuja). Tässä on koko koodi BasicAuthenticationFilter luokka, joka sisältää käyttäjän tunnistetietojen tarkistuksen.

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

    {

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

        {

yrittää

            {

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

                {

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

                }

muu

                {

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

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

httpRequestHeader = httpRequestHeader.Substring ("Valtuutus". Pituus);

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

merkkijono käyttäjänimi = Encoding.UTF8.GetString (Convert.FromBase64String (httpRequestHeaderValues ​​[0]));

merkkijonon salasana = Encoding.UTF8.GetString (Muunna.FromBase64String (httpRequestHeaderValues ​​[1]));

if (käyttäjänimi.Equals ("joydip") && password.Equals ("joydip123"))

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

muu

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

                }

            }

saada kiinni

            {

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

            }

        }

    }

Ohjainluokassa sinun on määritettävä attribuutti asianmukaisesti. Huomaa, että Perustodennus attribuutti viittaa tässä BasicAuthenticationAttribute luokan toteutimme.

    [Perustodennus]

public class DefaultController: ApiController

    {

public IEnumerable Get ()

        {

palauta uusi merkkijono [] {"Joydip", "Kanjilal"};

        }

    }

Nyt on vähän asetuksia --- sinun on määritettävä määritteitä siten, että puhelut ohjaimellesi suodatetaan asianmukaisesti, jotta todennus toimisi.

 julkinen staattinen luokka WebApiConfig

    {

public static void Register (HttpConfiguration config)

        {

config.MapHttpAttributeRoutes ();

config.Routes.MapHttpRoute (

nimi: "DefaultApi",

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

oletusarvot: uusi {id = RouteParameter.Optional}

            );

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

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

        }

    }

Ja olet valmis! Kun suoritat testitapauksen, testi läpäisee.

Sinun tulisi joka tapauksessa varmistaa, että tunnistetietoja ei ole koodattu; pikemminkin ne tulisi tallentaa tietokantaan ja sinun tulisi noutaa ne ja vahvistaa OnActionExecuting menetelmä BasicAuthenticationAttribute luokassa.

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