Web Service(WS) Security Tutorial med SOAP Eksempel
Hvad er WS Security?
WS Security er en standard, der adresserer sikkerhed, når data udveksles som en del af en webtjeneste. Dette er en nøglefunktion i SOAP, der gør den meget populær til at skabe webtjenester.
Sikkerhed er en vigtig funktion i enhver webapplikation. Da næsten alle webapplikationer er udsat for internettet, er der altid en chance for en sikkerhedstrussel mod webapplikationer. Når du udvikler webbaserede applikationer, anbefales det derfor altid at sikre, at applikationen er designet og udviklet med sikkerhed for øje.
Sikkerhedstrusler og modforanstaltninger
For at forstå sikkerhedstrusler, som kan være fjendtlige over for en webapplikation, lad os se på et simpelt scenarie for en webapplikation og se, hvordan det fungerer med hensyn til sikkerhed.
En af de tilgængelige sikkerhedsforanstaltninger for HTTP er HTTPS-protokollen. HTTPS er den sikre måde at kommunikere mellem klienten og serveren på over nettet. HTTPS gør brug af Secure Sockets-laget eller SSL til sikker kommunikation. Både klienten og serveren vil have et digitalt certifikat til at identificere sig selv som ægte, når der sker kommunikation mellem klienten og serveren.
I en standard HTTPS-kommunikation mellem klienten og serveren finder de følgende trin sted
- Klienten sender en anmodning til serveren via klientcertifikatet. Når serveren ser klientcertifikatet, laver den en note i sit cachesystem, så den ved, at svaret kun skal gå tilbage til denne klient.
- Serveren autentificerer sig selv over for klienten ved at sende dens certifikat. Dette sikrer, at klienten kommunikerer med den rigtige server.
- Al kommunikation herefter mellem klient og server er krypteret. Dette sikrer, at hvis andre brugere forsøger at bryde sikkerheden og få de nødvendige data, ville de ikke være i stand til at læse dem, fordi de ville være krypteret.
Men ovenstående type sikkerhed vil ikke fungere i alle situationer. Der kan komme et tidspunkt, hvor klienten kan tale med flere servere. Et eksempel nedenfor viser en klient, der taler til både en database og en webserver ad gangen. I sådanne tilfælde kan ikke alle oplysninger passere gennem https-protokollen.
Det er her SOAP kommer i aktion for at overvinde sådanne forhindringer ved at have WS Security-specifikationen på plads. Med denne specifikation er alle sikkerhedsrelaterede data defineret i SOAP-header-elementet.
Header-elementet kan indeholde nedenstående information
- Hvis meddelelsen i SOAP-legemet er blevet signeret med en sikkerhedsnøgle, kan denne nøgle defineres i header-elementet.
- Hvis et element i SOAP Body er krypteret, vil headeren indeholde de nødvendige krypteringsnøgler, så meddelelsen kan dekrypteres, når den når destinationen.
I flere servermiljøer hjælper ovenstående teknik med SOAP-godkendelse på følgende måde.
- Da SOAP-kroppen er krypteret, vil den kun kunne dekrypteres af den webserver, der er vært for webtjenesten. Dette er på grund af, hvordan SOAP-protokollen er designet.
- Antag, at hvis meddelelsen sendes til databaseserveren i en HTTP-anmodning, kan den ikke dekrypteres, fordi databasen ikke har de rigtige mekanismer til at gøre det.
- Først når anmodningen rent faktisk når webserveren som en SOAP-protokol, vil den være i stand til at dechifrere beskeden og sende det relevante svar tilbage til klienten.
Vi vil i de efterfølgende emner se, hvordan WS Security-standarden kan bruges til SOAP.
Web Service Sikkerhedsstandarder
Som diskuteret i det tidligere afsnit, drejer WS-Security-standarden sig om at have sikkerhedsdefinitionen inkluderet i SOAP-headeren.
Oplysningsoplysningerne i SOAP-headeren administreres på 2 måder.
For det første definerer det et særligt element kaldet UsernameToken. Dette bruges til at videregive brugernavn og adgangskode til webtjenesten.
Den anden måde er at bruge et binært token via BinarySecurityToken. Dette bruges i situationer, hvor krypteringsteknikker som Kerberos eller X.509 bruges.
Nedenstående diagram viser flowet af, hvordan sikkerhedsmodellen fungerer i WS Security
Nedenfor er de trin, der finder sted i ovenstående arbejdsgang
- En anmodning kan sendes fra webserviceklienten til Security Token Service. Denne service kan være en mellemliggende webservice, som er specielt bygget til at levere brugernavne/adgangskoder eller certifikater til selve SOAP-webservicen.
- Sikkerhedstokenet videregives derefter til webserviceklienten.
- Webtjenesteklienten kaldte derefter webtjenesten, men denne gang sikrede den, at sikkerhedstokenet er indlejret i SOAP-meddelelsen.
- Webtjenesten forstår derefter SOAP-meddelelsen med godkendelsestokenet og kan derefter kontakte Security Token-tjenesten for at se, om sikkerhedstokenet er autentisk eller ej.
Nedenstående uddrag viser formatet af godkendelsesdelen, som er en del af WSDL-dokumentet. Baseret på nedenstående uddrag vil SOAP-meddelelsen nu indeholde 2 yderligere elementer, det ene er brugernavnet og det andet er adgangskoden.
<xs:element name="UsernameToken"> <xs:complexType> <xs:sequence> <xs:element ref="Username"/> <xs:element ref="Password" minOccurs="0"/> </xs:sequence> <xs:attribute name="Id" type="xs:ID"/> </xs:complexType></xs:element>
Når SOAP-meddelelsen faktisk sendes mellem klienterne og serveren, kan den del af meddelelsen, der indeholder brugeroplysningerne, se ud som den, der er vist ovenfor. Wsse elementnavnet er et specielt element navngivet defineret for SOAP og betyder, at det indeholder sikkerhedsbaseret information.
Sådan bygger du sikre webtjenester
Lad os nu se på SOAP-webservicesikkerhedseksemplet. Vi vil bygge en webservicesikkerhed på det eksempel, der blev vist tidligere i SOAP-kapitlet, og vil tilføje et sikkerhedslag til det.
I vores eksempel skal vi lave en simpel webtjeneste, som vil blive brugt til at returnere en streng til den applikation, der kalder webtjenesten. Men denne gang, når webtjenesten påkaldes, skal legitimationsoplysningerne leveres til den opkaldende tjeneste. Lad os følge nedenstående trin for at oprette vores SOAP-webservice og tilføje sikkerhedsdefinitionen til den.
Trin 1) Det første trin er at oprette en tom Asp.Net Webapplikation. Fra Visual Studio 2013 skal du klikke på menupunktet Filer->Nyt projekt.
Når du klikker på indstillingen Nyt projekt, giver Visual Studio dig en anden dialogboks til at vælge projekttype og give de nødvendige detaljer om projektet. Dette forklares i næste trin
Trin 2) I dette trin,
- Sørg for, at du først vælger C# webskabelon til ASP.NET webapplikation. Projektet skal være af denne type for at kunne oprette webserviceprojekt. Ved at vælge denne mulighed vil Visual Studio derefter udføre de nødvendige trin for at tilføje nødvendige filer, som kræves af enhver webbaseret applikation.
- Giv dit projekt et navn, som i vores tilfælde er blevet givet som "webservice.asmx.” Sørg derefter for at angive en placering, hvor projektfilerne bliver gemt.
Når du er færdig, vil du se projektfilen oprettet i din løsningsstifinder i Visual Studio 2013.
Trin 3) I dette trin,
Vi vil tilføje en webservicefil til vores projekt
- Først Højreklik på projektfilen som vist nedenfor
- Når du højreklikker på projektfilen, har du mulighed for at vælge muligheden "Tilføj->Webservice (ASMX) for at tilføje en webtjenestefil. Angiv blot et navn på Tutorial Service for webtjenestens navnefil.
Ovenstående trin vil vise en dialogboks, hvori man kan indtaste navnet på webservicefilen. Så i nedenstående dialogboks skal du indtaste navnet på TutorialService som filnavn.
Trin 4) Tilføj følgende kode til din Tutorial Service asmx-fil. Nedenstående kodestykke bruges til at tilføje en brugerdefineret klasse, som vil blive brugt til at ændre SOAP-headeren, når SOAP-meddelelsen genereres. Da vi nu ønsker at tilføje sikkerhedsoplysninger til SOAP-headeren, er dette trin påkrævet.
return "This is a Guru99 Web Service"; } public class AuthHeader : SoapHeader { public string UserName; public string Password; } }
Kodeforklaring:-
- Vi er nu ved at oprette en separat klasse kaldet AuthHeader som er af typen SoapHeader klasse. Hver gang du ønsker at ændre, hvad der sendes i SOAP-headeren, skal du oprette en klasse, der bruger den indbyggede SoapHeader-klasse .Net. Ved at tilpasse SOAPheaderen har vi nu mulighed for at videregive et 'Brugernavn' og 'Password', når webservicen kaldes.
- Vi definerer derefter variabler af 'Brugernavn' og 'Password', som er af typen streng. De vil blive brugt til at indeholde værdierne af brugernavnet og adgangskoden, som videregives til webtjenesten.
Trin 5) Som det næste trin skal følgende kode tilføjes til det samme TutorialService.asmx fil. Denne kode definerer faktisk vores webservices funktion. Denne funktion returnerer en streng "This is a Guru99 Web service" til klienten. Men denne gang vil strengen kun blive returneret, hvis klientapplikationen videregiver legitimationsoplysningerne til webtjenesten.
public class TutorialService : System.Web.Services.WebService { public AuthHeader Credentials; [SoapHeader("Credentials")] [WebMethod] public string Guru99WebService() { if (Credentials.UserName.ToLower() != "Guru99" || Credentials.Password.ToLower() != "Guru99Password") { throw new SoapException("Unauthorized", SoapException.ClientFaultCode); } eise return "This is a Guru99 Web service"; }
Kodeforklaring:-
- Her opretter vi et objekt af AuthHeader-klassen, som blev oprettet i det tidligere trin. Dette objekt vil blive videregivet til vores Guru99 Webservice hvor brugernavn og adgangskode kan undersøges nærmere.
- [SoapHeader]-attributten bruges nu til at angive, at når webtjenesten kaldes, skal brugernavnet og adgangskoden sendes.
- I denne kodeblok undersøger vi faktisk det brugernavn og den adgangskode, der sendes, når webtjenesten kaldes. Hvis brugernavnet er lig med "Guru99", og adgangskoden er lig med "Guru99Password", så sendes meddelelsen "This is a Guru99 Web service" til klienten. Ellers vil der blive sendt en fejl til klienten, hvis det forkerte bruger-id og kodeord sendes.
Hvis koden eksekveres med succes, vil følgende output blive vist, når du kører din kode i browseren.
Output:
Ovenstående output vises, når programmet køres, hvilket betyder, at webtjenesten nu er tilgængelig. Lad os klikke på tjenesten Descriptionforbindelse.
Fra tjenestebeskrivelsen vil du nu kunne se, at brugernavnet og adgangskoden er elementer i wsdl fil. Disse parametre skal sendes, når webtjenesten aktiveres.
Web Service Security Bedste Practices
Følgende er sikkerhedsovervejelser, som bør bemærkes, når du arbejder med webtjenester
1. Revision og logstyring – Brug applikationslogning til at logge alle anmodninger, som kommer til webtjenesterne. Dette giver en detaljeret rapport om, hvem der har påberåbt sig webservicen og kan hjælpe med Impact-analyse, hvis der opstår et sikkerhedsbrud.
2. Flow af opkald til webtjenesten – Prøv at notere strømmen af opkald i webtjenester. Som standard kan en applikation kalde flere webtjenesteranmodninger med godkendelsestokens, der sendes mellem disse webtjenester. Alle opkald mellem webtjenester skal overvåges og logges.
3. Følsomme oplysninger – Medtag ikke følsomme oplysninger i dine logposter, såsom adgangskoder eller kreditkortnumre eller nogen form for anden fortrolig information. Hvis der er en hændelse, som har nogen af disse oplysninger, skal den kasseres før logning.
4. Spor Business Operationer – Spor væsentlige forretningsaktiviteter. Instrumenter for eksempel din applikation til at registrere adgang til særligt følsomme metoder og forretningslogik. Lad os tage et eksempel på en online shoppingapplikation. Der er flere trin i en typisk applikation, såsom at vælge de varer, der skal købes, de varer, der er læsset i kurven og derefter det endelige køb. Hele denne virksomheds arbejdsgang skal spores af webtjenesten.
5. Korrekt godkendelse – Autentificering er den mekanisme, hvormed kunderne kan etablere deres identitet med webtjenesten ved hjælp af et bestemt sæt legitimationsoplysninger, der kan bevise denne identitet. Man bør aldrig gemme brugeroplysningerne, og derfor, hvis WS Security bruges til at kalde webtjenesten, skal det bemærkes, at webtjenesten ikke skal gemme de legitimationsoplysninger, der sendes i SOAP-headeren. Disse bør kasseres af webtjenesten.
Resumé
- SOAP giver et ekstra lag kaldet WS Security for at give yderligere sikkerhed, når der foretages opkald til webtjenester.
- WS Security kan kaldes med et simpelt brugernavn eller password eller kan bruges med binære certifikater til godkendelse
- Det har vi set i . Net vi kan tilpasse webtjenesten til at få et brugernavn og en adgangskode sendt som en del af SOAP-header-elementet.