
Mellékelt példa megnyitása előtt szükséges egy WSEServer nevű virtuális könyvtár létrehozása, mely a példa mappájában található WSEServer alkönyvtárra mutat. Ehhez nyissa meg a mappa Tulajdonság ablakát és itt a Webmegosztás lapon engedélyezze a mappa megosztását olvasási és parancsfájlok futtatási jogával.
A szerviz alkalmazás futtatása előtt gondoskodnunk kell arról, hogy a Web szerver virtuális mappájában engedélyezzük a névtelen hozzáférést.
A mellékelt példa használatához telepítenünk kell a Microsoft WSE 1.0 csomagot. Ennek elvégzéséhez olvassa el a Kezdeti lépések című fejezetet.
Kezdeti lépések
A Microsoft által elkészített csomag a Web Services Enhancements for Microsoft .NET nevet viseli, és cikkünk írásakor a következő Webcímen volt elérhető, mely természetesen megváltozhatott: http://msdn.microsoft.com/webservices/building/wse/default.aspx.
Letöltve az állományt (Web Services Enhancements 1.0 for Microsoft .NET.msi) telepítenünk kell a .NET Framework alá. Az öntelepítő állomány erről gondoskodik, a használható .DLL állomány (Microsoft.Web.Services.dll), és a kapcsolódó dokumentáció alapértelmezésben a következő mappába kerül: %winroot%:\Program Files\Microsoft WSE\v1.0.2312\.
A telepített assembly bekerül a globális assembly-listába, így amikor referenciaként megadjuk alkalmazásainkban, akkor a globális palettáról kell kiválasztanunk, nem pedig valamilyen alternatív mappából.
Web szerviz megvalósítása
A szerviz alkalmazás egy nyilvános metódussal rendelkezik, mely nem tesz mást, mint ellenőrzi, hogy a felhasználótól a várt hitelesítési információkat adta meg, vagy nem. A neve ControlUser, mely a kliensből paraméterek átadása nélkül hívható.
A WSE csomag névtereinek eléréséhez referenciaként mind a kliens, mind a szerver-alkalmazásokban meg kell adni a Microsoft.Web.Services.dll állományt. Ehhez válasszuk a Project - Add reference menüpontot, majd a megjelenő ablakban a .NET lapon keressük elő a Microsoft.Web.Services.dll elemet.
A szükséges osztályok eléréséhez meg kell adnunk a következő hivatkozásokat:
using System.Security.Permissions;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Security.Cryptography;
using Microsoft.Web.Services;
using Microsoft.Web.Services.Security;
A szerviz alkalmazás a fenti metódusban feldolgozza a kliens által küldött SOAP üzenetet, mely tartalmazza a hitelesítési információkat. Ehhez szüksége van a kérés adatfolyamára, mely a következőképpen nyerhető ki:
SoapContext cont = HttpSoapContext.RequestContext;
A szerviz a klienstől egy felhasználónév-jelszó párt kap, mely egy UsernameToken objektum formájában tárolódik. A szerviz ellenőrzi a felhasználónevet, valamint a jelszót. Az ellenőrzés után küld egy üzenetet a klienshez az eredményről.
A felhasználónév ellenőrzéséhez meghív egy IsValidUser nevű metódust, mely paraméterként a küldött adatfolyamot kapja meg, majd ezt feldolgozva ad vissza TRUE, vagy FALSE értéket attól függően, hogy a felhasználónév megfelelő vagy sem. A küldött üzenet aláírást is tartalmaz, mely a kliens-alkalmazásban a Signature osztály segítségével volt létrehozva, és a felhasználói TOKEN aláírására szolgál.
A metódusban először megvizsgáljuk, hogy hány titkosításra vonatkozó elemet tartalmaz az üzenet. Csak nullánál nagyobb szám esetén történik feldolgozás.
private bool IsValidInfo(SoapContext cont)
{
bool good = false;
if (cont.Security.Tokens.Count > 0)
{
Megvizsgáljuk, hogy az üzenet tartalmaz-e aláírást.
Signature signature = cont.Security.Elements[i] as Signature;
if ( signature != null && ( signature.SignatureOptions & SignatureOptions.IncludeSoapBody) != 0 )
{
Amennyiben igen, megvizsgáljuk, hogy a klienstől érkező üzenet UsernameToken objektumának UserName property-je a szervizt futtató számítógép Environment.UserName property-jében tárolt értéket tartalmazza, vagy sem. Amennyiben igen, akkor a metódus TRUE értékkel tér vissza.
UsernameToken token = signature.SecurityToken as UsernameToken;
if (token != null)
{
good = (token.Username == Environment.UserName)?true:false;
}
}
}
return good;
}
A szerviz hitelesítési folyamatának második lépése, hogy megtörténik a jelszóellenőrzés. Ennek biztosítására a szervizben létre kell hozni egy, az IPasswordProvider interfészt implementáló osztályt, és annak GetPassword virtuális metódusában meg kell adni, hogy a szerviz milyen jelszót fogadhat el. A metódusban lehet elhelyezni a felhasználónév-jelszó összerendelési logika kódját, mely tartalmazhat adatbázis-elérést, vagy bárminemű ellenőrző mechanizmust. A példánkban a metódus a „password” karakterlánccal tér vissza, ez lesz a klienstől elfogadható jelszó értéke.
public class SecurityPwd: IPasswordProvider
{
...
public string GetPassword(UsernameToken token)
{
return "password";
}
}
A szerviz konfigurációs állományában, a Web.config állományban jeleznünk kell, hogy mely osztály implementálja az említett interfészt. A fájl <microsoft.web.services> elemében kell elhelyezni a következő bejegyzést:
<microsoft.web.services>
<security>
<passwordProvider type="WSEServer.SecurityPwd, WSEServer" />
</security>
</microsoft.web.services>
Az osztály nevét kell megadnunk, valamint az azt tartalmazó assembly-t.
Proxy osztály készítése
A Visual Studio.NET beépített eszköze segítségével készíthetünk egy kliens proxy-t az alkalmazáshoz, melynek segítségével könnyen kapcsolat teremthető a szerviz metódusa és a hívó kliens program segítségével.
A %winroot%:\Program Files\Visual Studio.NET\FrameworkSDK\Bin mappában található program segítségével egy - a szerviz osztályával azonos nevű, .cs kiterjesztésű – állomány generálható, melyet a kliens projektbe felveszünk. A ValidatorService.cs állomány a következőképpen generálható parancssorból:
wsdl /out:ValidatorService.cs http://localhost/WSEServer/ValidatorService.asmx
A proxy osztály ősosztályának nevét meg kell változtatnunk, hiszen a WebServicesClientProtocol osztályból kell származtatni.
public class DataService : WebServicesClientProtocol
{
...
}
Ezt követően meg kell adnunk a proxy osztály állományának elején is a szükséges referenciát:
using Microsoft.Web.Services;
A kliens alkalmazás elkészítése
A kliensben a felhasználónév és a jelszó megadása után elindíthatjuk az átvitelt. A kezelőfüggvényben példányosítjuk a proxy-t.
ValidatorService vs = new ValidatorService();
A küldendő információ összeállításához létre kell hoznunk egy adatfolyam-objektumot:
SoapContext rContext = vs.RequestSoapContext;
A UsernameToken objektumban elhelyezzük a karakterláncokat:
UsernameToken token = new UsernameToken(textBox1.Text, textBox2.Text,PasswordOption.SendHashed);
Az aláírás Signature osztályából létrehozunk egy példányt.
Signature sign = new Signature(token);
A megadott adatokat elhelyezzük az üzenetben.
rContext.Security.Tokens.Add(token);
rContext.Security.Elements.Add(sign);
És meghívjuk a ControlUser metódust.
textBox3.Text = vs.ContolUser();