Προγραμματισμός

Εφαρμογή ελέγχου ταυτότητας HTTP στο Web API

Σε αυτό το άρθρο θα παρουσιάσω μια συζήτηση σχετικά με την εφαρμογή ελέγχου ταυτότητας HTTP στο Web API. Υπάρχουν δύο τρόποι με τους οποίους μπορείτε να εφαρμόσετε έλεγχο ταυτότητας HTTP στο Web Api. Αυτά περιλαμβάνουν:

  • Έλεγχος ταυτότητας με φόρμες
  • Βασικός έλεγχος ταυτότητας

Δεν θα θεωρούσαμε τον έλεγχο ταυτότητας των Windows ως εφικτή στρατηγική, καθώς δεν μπορείτε να εκθέσετε την υπηρεσία σας μέσω Διαδικτύου εάν αξιοποιήσετε τον έλεγχο ταυτότητας των Windows.

Ασφάλιση του Web Api χρησιμοποιώντας Έντυπο Έλεγχος ταυτότητας

Ο έλεγχος ταυτότητας με φόρμες χρησιμοποιεί τον πάροχο συνδρομής ASP.Net και χρησιμοποιεί τυπικά cookie HTTP αντί για την κεφαλίδα Εξουσιοδότηση. Ο έλεγχος ταυτότητας με φόρμες δεν είναι τόσο φιλικός προς το REST όσο χρησιμοποιεί cookies και οι πελάτες θα πρέπει να διαχειρίζονται cookie για να καταναλώνουν υπηρεσίες που εκμεταλλεύονται τον έλεγχο ταυτότητας με φόρμες, η οποία είναι ευάλωτη σε επιθέσεις πλαστογραφίας μεταξύ ιστότοπων. Αυτός είναι ο λόγος για τον οποίο θα πρέπει να εφαρμόσετε μέτρα CSRF εάν χρησιμοποιείτε έλεγχο ταυτότητας με φόρμες. Ο έλεγχος ταυτότητας με φόρμες δεν χρησιμοποιεί κρυπτογράφηση για να εξασφαλίσει τα διαπιστευτήρια του χρήστη. Επομένως, αυτή δεν είναι μια ασφαλής στρατηγική, εκτός εάν εκτελείτε το API Ιστού σας μέσω SSL.

Ασφαλές Web API χρησιμοποιώντας βασικό έλεγχο ταυτότητας

Ο βασικός έλεγχος ταυτότητας στέλνει τα διαπιστευτήρια του χρήστη σε απλό κείμενο μέσω του σύρματος. Εάν επρόκειτο να χρησιμοποιήσετε βασικό έλεγχο ταυτότητας, θα πρέπει να χρησιμοποιήσετε το Web API σας μέσω Secure Socket Layer (SSL). Όταν χρησιμοποιείτε βασικό έλεγχο ταυτότητας, θα μεταβιβάζουμε τα διαπιστευτήρια του χρήστη ή το διακριτικό ελέγχου ταυτότητας στην κεφαλίδα του αιτήματος HTTP. Η υπηρεσία από την πλευρά του διακομιστή θα πρέπει να αναλύσει την κεφαλίδα για να ανακτήσει το διακριτικό ελέγχου ταυτότητας. Εάν το αίτημα δεν είναι έγκυρο αίτημα, ο διακομιστής επιστρέφει HTTP 401, που σημαίνει μη εξουσιοδοτημένη απόκριση.

Ας διερευνήσουμε πώς μπορούμε να εκτελέσουμε βασικό έλεγχο ταυτότητας χρησιμοποιώντας ένα φίλτρο ενεργειών. Για να το κάνετε αυτό, πρέπει να δημιουργήσετε μια κλάση που προέρχεται από το System.Web.Http.Filters.ActionFilterAttribute τάξη όπως φαίνεται παρακάτω:

δημόσια τάξη BasicAuthenticationAttribute: System.Web.Http.Filters.ActionFilterAttribute

    {

ιδιωτικό Boolean IsUserValid (διαπιστευτήρια λεξικού)

        {

if (διαπιστευτήρια ["Όνομα χρήστη"]. Ισούται ("joydip") && διαπιστευτήρια ["Κωδικός πρόσβασης"]. Ισούται ("joydip123"))

επιστροφή αληθινή?

επιστροφή ψευδής?

        }

ιδιωτικό λεξικό ParseRequestHeaders (System.Web.Http.Controllers.HttpActionContext actionContext)

        {

Διαπιστευτήρια λεξικού = νέο λεξικό ();

var httpRequestHeader = actionContext.Request.Headers.GetValues ​​("Εξουσιοδότηση"). FirstOrDefault ();

httpRequestHeader = httpRequestHeader.Substring ("Εξουσιοδότηση". Μήκος);

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

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

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

διαπιστευτήρια. Προσθήκη ("Όνομα χρήστη", όνομα χρήστη);

διαπιστευτήρια. Προσθήκη ("Κωδικός πρόσβασης", κωδικός πρόσβασης);

διαπιστευτήρια επιστροφής;

        }

δημόσια παράκαμψη void OnActionExecuting (System.Web.Http.Controllers.HttpActionContext actionContext)

        {

δοκιμάστε

            {

εάν (actionContext.Request.Headers.Authorization == null)

                {

actionContext.Response = νέο System.Net.Http.HttpResponseMessage (System.Net.HttpStatusCode.Unauthorized);

                }

αλλού

                {

Διαπιστευτήρια λεξικού = ParseRequestHeaders (actionContext);

                     εάν (IsUserValid (διαπιστευτήρια))

actionContext.Response = νέο System.Net.Http.HttpResponseMessage (System.Net.HttpStatusCode.OK);

αλλού

actionContext.Response = νέο System.Net.Http.HttpResponseMessage (System.Net.HttpStatusCode.Unauthorized);

                 }

            }

σύλληψη

            {

actionContext.Response = νέο System.Net.Http.HttpResponseMessage

(System.Net.HttpStatusCode.InternalServerError);

            }

        }

    }

Ελέγχουμε αν υπάρχει η κεφαλίδα εξουσιοδότησης. Εάν όχι, επιστρέφεται μια απόκριση HTTP 401 ή "μη εξουσιοδοτημένη".

Το επόμενο βήμα είναι η επικύρωση των διαπιστευτηρίων χρήστη που έχουν περάσει μέσω της κεφαλίδας αιτήματος εξουσιοδότησης από τον πελάτη. Πριν το κάνουμε αυτό, πρέπει να γνωρίζουμε πώς πρέπει να κληθεί το Web API από τον πελάτη. Για αυτό, έχω ετοιμάσει μια μέθοδο δοκιμής. Η μέθοδος δοκιμής χρησιμοποιεί το HttpClient τάξη για κλήση του Web API. Σημειώστε ότι τα ονόματα χρηστών μετατρέπονται σε μορφή συμβολοσειράς Base64 πριν περάσουν. Η μέθοδος δοκιμής δίνεται παρακάτω.

[Μέθοδος ελέγχου]

δημόσιο κενό BasicAuthenticationTest ()

        {

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

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

HttpClient client = νέο HttpClient ();

client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue ("Εξουσιοδότηση", όνομα χρήστη + ":" + κωδικός πρόσβασης);

var result = client.GetAsync (νέο Uri ("// localhost // api / default /")). Αποτέλεσμα;

Assert.IsTrue (αποτέλεσμα.IsSuccessStatusCode);

        }

Όπως μπορείτε να δείτε στο παραπάνω απόσπασμα κώδικα, τα διαπιστευτήρια χρήστη μεταβιβάζονται χρησιμοποιώντας την κεφαλίδα εξουσιοδότησης.

Τώρα που ο πελάτης είναι έτοιμος, ας ολοκληρώσουμε την εφαρμογή του Βασικό φίλτρο ελέγχου ταυτότητας τάξη. μεσα στην OnActionExecuting μέθοδος θα πρέπει να αναλύσουμε την τιμή κεφαλίδας σε αυτήν την τάξη και να ελέγξουμε αν τα διαπιστευτήρια που παρέχονται από τον πελάτη ταιριάζουν. Προς το παρόν, ας υποθέσουμε ότι το όνομα χρήστη και ο κωδικός πρόσβασης έχουν τιμές χαρά και joydip123, αντίστοιχα (είναι κωδικοποιημένα). Εδώ είναι ο πλήρης κωδικός του Βασικό φίλτρο ελέγχου ταυτότητας κλάση που ενσωματώνει την επικύρωση των διαπιστευτηρίων χρήστη.

δημόσια τάξη BasicAuthenticationAttribute: System.Web.Http.Filters.ActionFilterAttribute

    {

δημόσια παράκαμψη void OnActionExecuting (System.Web.Http.Controllers.HttpActionContext actionContext)

        {

δοκιμάστε

            {

εάν (actionContext.Request.Headers.Authorization == null)

                {

actionContext.Response = νέο System.Net.Http.HttpResponseMessage (System.Net.HttpStatusCode.Unauthorized);

                }

αλλού

                {

actionContext.Response = νέο System.Net.Http.HttpResponseMessage (System.Net.HttpStatusCode.InternalServerError);

var httpRequestHeader = actionContext.Request.Headers.GetValues ​​("Εξουσιοδότηση"). FirstOrDefault ();

httpRequestHeader = httpRequestHeader.Substring ("Εξουσιοδότηση". Μήκος);

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

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

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

εάν (όνομα χρήστη.Equals ("joydip") && password.Equals ("joydip123"))

actionContext.Response = νέο System.Net.Http.HttpResponseMessage (System.Net.HttpStatusCode.OK);

αλλού

actionContext.Response = νέο System.Net.Http.HttpResponseMessage (System.Net.HttpStatusCode.Unauthorized);

                }

            }

σύλληψη

            {

actionContext.Response = νέο System.Net.Http.HttpResponseMessage (System.Net.HttpStatusCode.InternalServerError);

            }

        }

    }

Στην τάξη ελεγκτή θα πρέπει να καθορίσετε το χαρακτηριστικό κατάλληλα. Σημειώστε ότι το Βασικός έλεγχος ταυτότητας το χαρακτηριστικό εδώ αναφέρεται στο BasicAuthenticationAttribute τάξη που εφαρμόσαμε.

    [Βασικός έλεγχος ταυτότητας]

δημόσια τάξη DefaultController: ApiController

    {

δημόσια IEnumerable Get ()

        {

επιστροφή νέας συμβολοσειράς [] {"Joydip", "Kanjilal"};

        }

    }

Τώρα, λίγο διαμόρφωση --- πρέπει να διαμορφώσετε το χαρακτηριστικό έτσι ώστε οι κλήσεις προς τον ελεγκτή σας να φιλτράρονται κατάλληλα για να λειτουργήσει ο έλεγχος ταυτότητας.

 δημόσια στατική τάξη WebApiConfig

    {

Δημόσιο στατικό άκυρο Μητρώο (HttpConfiguration config)

        {

config.MapHttpAttributeRoutes ();

config.Routes.MapHttpRoute (

όνομα: "DefaultApi",

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

προεπιλογές: νέο {id = RouteParameter.Optional}

            );

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

GlobalConfiguration.Configuration.Filters.Add (νέο BasicAuthenticationAttribute ());

        }

    }

Και τελειώσατε! Όταν εκτελείτε τη δοκιμαστική θήκη, η δοκιμή περνά.

Θα πρέπει ούτως ή άλλως να βεβαιωθείτε ότι τα διαπιστευτήρια δεν είναι κωδικοποιημένα. μάλλον, θα πρέπει να αποθηκευτούν σε μια βάση δεδομένων και θα πρέπει να τα ανακτήσετε και να επικυρώσετε στο OnActionExecuting μέθοδος του BasicAuthenticationAttribute τάξη.