Programování

Implementujte ověřování HTTP ve webovém rozhraní API

V tomto článku bych představil diskusi o implementaci autentizace HTTP ve webovém API. Existují dva způsoby, jak můžete implementovat ověřování HTTP ve vašem Web Api. Tyto zahrnují:

  • Ověřování formulářů
  • Základní ověřování

Nepovažovali bychom ověřování systému Windows za proveditelnou strategii, protože nemůžete vystavit svou službu přes internet, pokud využijete ověřování systému Windows.

Zabezpečení Web Api pomocí ověřování formulářů

Ověřování formulářů používá poskytovatele členství ASP.Net a místo záhlaví autorizace používá standardní soubory cookie HTTP. Ověřování pomocí formulářů není REST přátelské, protože používá soubory cookie, a klienti by museli spravovat soubory cookie, aby mohli využívat služby využívající výhody ověřování formulářů, které je zranitelné vůči útokům padělání mezi weby. To je důvod, proč byste museli implementovat opatření CSRF, pokud používáte ověřování formulářů. Ověřování formulářů nepoužívá šifrování k zabezpečení pověření uživatele. Proto to není bezpečná strategie, pokud nespustíte své webové rozhraní API přes SSL.

Zabezpečené webové rozhraní API pomocí základního ověřování

Základní ověřování odesílá pověření uživatele v textu žádosti přes drát. Pokud byste měli používat základní ověřování, měli byste používat své webové API přes zabezpečenou vrstvu protokolu SSL (Secure Socket Layer). Při použití základního ověřování bychom předali pověření uživatele nebo ověřovací token v záhlaví požadavku HTTP. Služba na straně serveru bude muset analyzovat záhlaví, aby načetla ověřovací token. Pokud požadavek není platný, vrátí server HTTP 401, což znamená neoprávněnou odpověď.

Prozkoumejme, jak můžeme provádět základní ověřování pomocí akčního filtru. Chcete-li to provést, měli byste vytvořit třídu, která odvozuje System.Web.Http.Filters.ActionFilterAttribute třída, jak je uvedeno níže:

veřejná třída BasicAuthenticationAttribute: System.Web.Http.Filters.ActionFilterAttribute

    {

private Boolean IsUserValid (pověření slovníku)

        {

if (pověření ["Uživatelské jméno"]. Rovná se ("joydip") && pověření ["Heslo"]. Rovná se ("joydip123"))

návrat true;

návrat false;

        }

soukromý slovník ParseRequestHeaders (System.Web.Http.Controllers.HttpActionContext actionContext)

        {

Pověření slovníku = nový slovník ();

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

httpRequestHeader = httpRequestHeader.Substring ("Autorizace" .Length);

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", uživatelské jméno);

credentials.Add ("Heslo", heslo);

vrátit přihlašovací údaje;

        }

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

        {

Snaž se

            {

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

                {

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

                }

jiný

                {

Pověření slovníku = ParseRequestHeaders (actionContext);

                     if (IsUserValid (pověření))

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

jiný

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

                 }

            }

chytit

            {

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

(System.Net.HttpStatusCode.InternalServerError);

            }

        }

    }

Zkontrolujeme, zda je k dispozici autorizační hlavička; pokud ne, vrátí se odpověď HTTP 401 nebo „neoprávněná“.

Dalším krokem je ověření přihlašovacích údajů uživatele předaných prostřednictvím záhlaví požadavku na autorizaci od klienta. Než to uděláme, měli bychom vědět, jak má být webové rozhraní API voláno od klienta. K tomu jsem připravil zkušební metodu. Zkušební metoda používá HttpClient třída pro volání webového API. Všimněte si, že uživatelská jména jsou před předáním převedena do formátu řetězce Base64. Zkušební metoda je uvedena níže.

[Testovací metoda]

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 ("Autorizace", uživatelské jméno + ":" + heslo);

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

Assert.IsTrue (result.IsSuccessStatusCode);

        }

Jak vidíte ve výše uvedeném fragmentu kódu, pověření uživatele se předávají pomocí autorizační hlavičky.

Nyní, když je klient připraven, dokončíme implementaci BasicAuthenicationFilter třída. Uvnitř OnActionExecuting metodu bychom museli analyzovat hodnotu záhlaví v této třídě a zkontrolovat, zda se shodují pověření dodaná od klienta. Prozatím předpokládejme, že uživatelské jméno a heslo má hodnoty joydip a joydip123(jsou pevně zakódovány). Zde je kompletní kód BasicAuthenticationFilter třída, která zahrnuje ověření přihlašovacích údajů uživatele.

veřejná třída BasicAuthenticationAttribute: System.Web.Http.Filters.ActionFilterAttribute

    {

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

        {

Snaž se

            {

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

                {

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

                }

jiný

                {

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

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

httpRequestHeader = httpRequestHeader.Substring ("Autorizace". Délka);

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);

jiný

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

                }

            }

chytit

            {

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

            }

        }

    }

Ve své třídě řadiče byste měli odpovídajícím způsobem zadat atribut. Všimněte si, že Základní ověřování atribut zde odkazuje na BasicAuthenticationAttribute třída, kterou jsme implementovali.

    [BasicAuthentication]

veřejná třída DefaultController: ApiController

    {

public IEnumerable Get ()

        {

vrátit nový řetězec [] {"Joydip", "Kanjilal"};

        }

    }

Nyní trochu konfigurace --- musíte nakonfigurovat atribut tak, aby volání na váš řadič byly filtrovány odpovídajícím způsobem, aby ověření fungovalo.

 veřejná statická třída WebApiConfig

    {

public static void Register (HttpConfiguration config)

        {

config.MapHttpAttributeRoutes ();

config.Routes.MapHttpRoute (

name: "DefaultApi",

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

výchozí: nový {id = RouteParameter.Optional}

            );

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

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

        }

    }

A jste hotovi! Když provedete testovací případ, test projde.

Každopádně byste měli zajistit, aby pověření nebyla pevně zakódována; spíše by měly být uloženy v databázi a měli byste je načíst a ověřit v OnActionExecuting metoda BasicAuthenticationAttribute třída.

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