Jag gör en webapplikation som innehåller en webservice bl.a. Denna webservice anropas via AJAX av några olika jQuery-funktioner i applikationen. Givetvis vill jag ju nu att webservicen enbart ska svara på requests från min webapplikation, inte att någon annan ska kunna ansluta till den. Det bör inte vara möjligt att göra på ett säkert sätt. Om webläsaren ska göra ett HTTP-anrop så finns det alltid sätt att fejka så att andra applikationer ser ut att vara besökarens webläsare. lägg till tex Anv, Pass i dina funktioner. Är det fel Anv Pass så retuneras ingen data. Användare och lösen måste finnas i klienten (websidan) och kan alltså kopieras till den som vill snylta av webservicen. Kan du inte bara kolla vilket ip-nummer anropet kommer ifrån? Läs frågan igen, Pelle :). Han gör anropet med Ajax, alltså från klienten. Kan därför vara vilken ip som helst. Även om han gjorde en mellanlösning Ajax => servern => webbservice, för att kunna kolla att ip == serverns ip, kan ju vem som helst anropa "mellanlagret" dirket, vilket spelar ut sin roll. Kort svar: det går inte att skydda sig, hur du än gör så kommer det gå att ta sig runt om man verkligen vill.Endast tillåta anrop till webservice från egen webbapplikation
Går detta att spärra på något vis i asp.net? Finns det andra möjligheter? Pagemethods kanske, vilket kanske också gör att enbart inloggade användare kommer åt metoderna?
/RickardSv: Endast tillåta anrop till webservice från egen webbapplikation
JohanSv: Endast tillåta anrop till webservice från egen webbapplikation
Sv:Endast tillåta anrop till webservice från egen webbapplikation
Det beror ju lite på vad man vill skydda sig mot. Man skulle kunna tänka sig att varje session får ett eget lösen som bara är giltigt en kort stund. Men under tiden den är giltig kan man använda sig av servicen från en annan "förbrukare". Men det kanske inte är ett problem?
JohanSv: Endast tillåta anrop till webservice från egen webbapplikation
Sv:Endast tillåta anrop till webservice från egen webbapplikation
Som Johan säger måste inloggningsuppgifterna finnas i varje anrop, vilket ju gör systemet lite känsligt.
Kanske nånsorts lösning enligt nedan kunde fungera:
<code>
Inloggning => Generera ett sessionsvärde och spara till databas tillsammans med ip. Skicka nonce.
Anrop => Kolla sessionsvärde mot sparad ip och ett nonce. Generera nytt nonce, skicka tillbaka.
</code>
Sen gäller det ju att fundera ut hur bra webbservicen verkligen behöver skyddas, och inte överdriva det hela.
http://en.wikipedia.org/wiki/Cryptographic_nonceSv: Endast tillåta anrop till webservice från egen webbapplikation
Långt svar: det beror på hur långt du är villig att gå för att skydda din webservice.
Några olika metoder:
1a) Sätt en session på din vanliga sida, kolla sedan att den är satt i webservicen. Betyder iaf. att man har besökt din vanliga sida innan webservicen. Skyddar mot en direkt nybörjare.
1b) Kolla referer
2) Grejja med lite inloggning, kolla inloggad i webservicen. Lite högre skydd, kan dock mecka till det för en vanlig användare om du i övrigt inte kräver någon inloggning
3) Gör lite jox med javascript, t.ex. att du anropar din webservice tre gånger på raken, resultatet ifrån första anropet => javascript med någon enkel algoritm, resultatet av javascript => andra anropet till webservice osv. Rätt sekvens == upplåst webservice. Lite högre säkerhet än bara att kontrollera inloggning.
4) Generera vissa bilder ifrån asp.net, dvs. vissa av bilderna som laddas/något javascript/en css-fil ska hämtas ifrån ett asp.net-script du har. Det asp.net-scriptet kan i sin tur sätta vissa session-flaggor som du sedan kontrollerar ifrån din webservice. Om du maskerar det lite snyggt med url rewriting så kommer det vara ganska svårt att lista ut det för någon som vill "fuska"
Om du kombinerar punkt 3) och punkt 4) så har du nog ett ganska tufft skydd, det borde avskräcka de flesta