
Mellékelt példa kipróbálásához szükséges egy LoginService nevű virtuális könyvtár létrehozása, mely arra a könyvtárra mutat, amelybe másolta a példát. Ehhez legegyszerűbb út az adott mappa tulajdonság ablakában lévő Webmegosztás lapon található, ahol engedélyezzük a megosztást.
Kezdjük a Web Service készítésével.
LoginService alkalmazás
Ahhoz, hogy szolgáltatásunkat korlátozni tudjuk az azonosítatlan felhasználók előtt, ahhoz a web.config állományban kell néhány bejegyzést elhelyeznünk, méghozzá az authorization bejegyzésnél:
<authorization>
<deny users="?" />
<allow users="*" />
</authorization>
A deny users sorban a kérdőjel arra utal, hogy minden azonosítatlan felhasználó számára a hozzáférés meg van tagadva.
Az allow users sorban lévő csillag arra utal, hogy minden azonosított (bejelentkezett) felhasználó számára a hozzáférés engedélyezett.
Nézzük miként lehet bejelentkezni:
Ehhez a Login nevű függvényünk fog segíteni. Itt a username és password paraméterben kell megkapnunk a szükséges azonosítókat a felhasználóról. Ezt a függvényen belül különböző módszerekkel eldönthetjük, hogy elfogadjuk-e vagy sem. Az egyszerűség kedvéért most fixen beépítettünk egy felhasználói nevet és jelszót, melyet elfogadunk.
[WebMethod]
public bool Login(string username, string password)
{
if (username=="software" && password=="online")
{
Ha érvényes felhasználói nevet és jelszót kaptunk, akkor a FormsAuthentication osztály SetAuthCookie függvényének hívásával jelezzük ezt a tényt egy Cookie létrehozásával és visszaadásával.
FormsAuthentication.SetAuthCookie(username, true);
return true;
}
else
Ellenkező esetben nem teszünk semmit az ügyben, hogy a felhasználónk azonosított legyen, így továbbra sem fog hozzáférni a Web Service-ünk funkcióihoz.
Hozzunk létre egy Logout nevű függvényt is, melyet meghívva a bejelentkezett felhasználó kijelentkezhet.
[WebMethod()]
public void Logout()
{
Ez esetben, ha már megtörtént a bejelentkezése, akkor meghívhatjuk a SignOut függvényt, mely elvégzi a felhasználó kijelentkeztetését.
if (Context.User.Identity.IsAuthenticated)
{
FormsAuthentication.SignOut();
}
}
Végül készítsünk egy olyan funkciót, mely a Web Service tényleges szolgáltatása. Ez ismét csak az egyszerűség kedvéért annyit tesz, hogy a paraméterként kapott szám kétszeresét adja vissza sztringként.
[WebMethod()]
public string OtherFunction(int a)
{
A funkciót csak akkor hajthatjuk végre, ha a felhasználó már érvényesen bejelentkezett.
if (Context.User.Identity.IsAuthenticated == true)
{
return (a*2).ToString();
}
Ha a felhasználó nincs azonosítva, akkor nem végezzük el a kettővel való szorzást, így aztán soha nem tudja meg szegény az eredményt, amíg hitelesen be nem tud jelentkezni.
else
{
return "Ez a funkció csak bejelentkezés után érhető el!";
}
}
TestApp alkalmazás
A teszt alkalmazás, melyből meghívjuk a Web Service függvényeit egy hagyományos Windows alkalmazás lesz. Ahhoz, hogy egyszerűen elérhessük a Web Service-t, készítsük el a proxy osztályt a WSDL.EXE segédprogrammal.
Wsdl http://localhost/LoginService/Service1.asmx?WSDL
A létrejött Service1.cs forráskódot adjuk hozzá a teszt alkalmazás projektéhez.
Ezt követően létrehozunk egy példányt a Service1 osztályból, majd már hívhatjuk is a Login függvényét a bejelentkezéshez.
Service1 s = new Service1();
s.Login(textBox1.Text, textBox2.Text)
Ha jó a felhasználói név és jelszó, akkor a bejelentkezés megtörténik és ez esetben az OtherFunction hívása is eredményes lesz és nem hibaüzenettel végződik.
private void button3_Click(object sender, System.EventArgs e)
{
label3.Text = s.OtherFunction(Convert.ToInt32(textBox3.Text));
}
Szükségünk lesz még egy lépésre a helyes működés érdekében: amikor a Login lefut és sikeresen bejelentkezünk, akkor egy cookie-t kapunk vissza. Ha ezt nem tároljuk és a következő kéréskor nem továbbítjuk, akkor a Web Service nem fog „emlékezni” ránk, így nem sikerül elérni a kívánt funkciót sem. Ahhoz, hogy ezzel ne legyen gondunk nem kell mást tennünk, mint létrehoznunk egy CookieContainer osztályt, mely képes a cookie-k tárolására és felhasználására. A létrehozott osztályt a Service1 osztály CookieContainer nevű property-jében kell hozzárendelnünk a Web Service osztályunkhoz. A létrehozás után már minden megy automatikusan, több gondunk nincs a bejelentkezés megoldásával.
s.CookieContainer = new CookieContainer();
Próbáljuk meg úgy is elérni az OtherFunction függvényt, hogy nem vagyunk bejelentkezve.