RIA, Web Dev »

[18 lis 2010 | 0 Comments]

image Silverlight po defaultu dolazi sa loader splash ekranom, koji je sve samo ne lijep. Neznam za čitatelje ovog teksta, ali ja čim vidim gradijente, odnosno prijelaze, još u kružnom obliku, dobijem iznenadnu želju za skakanjem sa vrha zgrade. Srećom, da ne bi slučajno došlo do realizacije tih želja gledajući brojna učitavanja Silverlight aplikacija, zamjena ekrana učitavanja je vrlo jednostavna.

Iz sljedećeg prikaza može se vidjeti slijed učitavanja aplikacije:

image

Splash screen i događaji koji ispisuju postotak učitavanja su u biti jedna XAML datoteka i Javascript metoda koja se poziva na promjenu postotka učitavanja i vrši interakciju sa elementima prikazanom XAML ekranu.

Postupak izrade izgleda ovako:

1. U jednoj XAML datoteci je potrebno pripremiti izgled ekrana. Ovdje se nalazi primjer takve datoteke,

2. Javascript metoda služi za prikaz i animiranje tog ekrana (potrebno dodati u posebnu JS datoteku i referencirati ju iz Head elementa od web stranice):

function SourceDownloadProgressChanged(s, e) {
    var bartext = s.findname("bartext");
    var bar = s.findname("bar");
    if (bartext != null || bar != null) {
        var value = Math.round(e.progress * 100)
        bartext.Text = value + "%";
        var newWidth = 3.3 * value;
        bar.Width = Math.round(newWidth)
    }
}

3. Dodatni parametri unutar poziva Silverlight aplkacije (u html/aspx, <object> element):

<param value="preloader.xaml" name="splashscreensource" />
<param value="SourceDownloadProgressChanged" name="onSourceDownloadProgressChanged" />

Web Dev, RIA »

[23 kol 2010 | 0 Comments]

Forms autentikacija

information security Forms autentikacija je standardni ASP.NET mehanizam koji koristi autentikacijski Cookie za spremanje korisničkih podataka. Može se koristiti sa ASP.NET membership and roles providerom i gotovim kontrolama za logiranje, ali ovdje je opisan način manualnog kreiranja autentikacijskog cookia. Sav promet nije kriptiran (osim mogućnosti binarne serijalizacije .NET objekata), i postoji mogućnost krađe cookia i krivog predstavljanja.

Konfiguracija web.configa ASP.NETa za upotrebu Forms autentikacije je vrlo kompleksna ;) :

<authentication mode="Forms"/>

Konfiguraciju web servisa (WCF) nije potrebno mijenjati kao na prethodnom principu sa SSLom, pošto se sadržaj SOAP poruka ne mijenja. Za autentikaciju klijenta potrebno je napravi web servis koji izvršava provjeru korisničkih podataka i sprema autentikacijski cookie u Response objekt, primjer (bez validacije korisnika):

[ServiceContract(Namespace = "")]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class AuthService
{
	[OperationContract]
	public bool Login(string username,string pass)
	{
		// provjera korisnika u bazi ...
		var ticket = new FormsAuthenticationTicket(1, username,								DateTime.Now,DateTime.Now.AddDays(7),true,"id"+username);

		var encrypt = FormsAuthentication.Encrypt(ticket);
		var authCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encrypt);
		HttpContext.Current.Response.Cookies.Add(authCookie);
		return true; // moguce je i vratiti poruku greske ili slicno
	}

	[OperationContract]
	public void Signout()
	{
		FormsAuthentication.SignOut();
	}
}

Primjer autentikacije klijenta: Više...

RIA, Web Dev »

[19 kol 2010 | 0 Comments]

Svaka poslovna Silverlight aplikacija zahtjeva prijavu korisnika, i na web servisu provjeru korisničkih podataka da bi se utvrdile dozvole izvršavanja metoda. WCF i Silverlight nude out-of-box autentikaciju koja se uglavnom zasnima na ASP.NET Membership provideru (u najvećem broju primjera dostupnih na netu). On radi tako da pripremi SQL Server bazu sa svojim tablicama, te se brine oko svih aspekata upravljanja korisnicima (prijava novog, promjena lozinke, osobni podaci, role,...). Kako ja u svojim aplikacijama nikada ne koristim taj membership provider, nego imam svoju bazu, svoje objekte (i ORM za pristup bazi), uz to sam uvjek bio pre ljen napraviti vlasitit membership provider, ne mogu iskoristiti gotove kontrole za prijavu. WCF nudi nekoliko načina prijave korisnika, od kojih su dva opisana ovdje.

Zahtjevi su jednostavni: prijava preko Silverlight aplikacije, metode web servisa ne smiju zahtjevati user id ili slično (npr. GetProducts(int logedUserID), provjera korisničkih podataka mora se obavljati u mojoj klasi, sa mojom bazom, svaki request/respons na Silverlight mora biti „potpisan“ sa ID-em logiranog korisnika, bilo preko cookia ili drugačije.

U ovom tekstu je opisana implementacija autentikacije Silverlight (SL) aplikacije na web servise. Opisana su dva načina konfiguracije WCF servisa, gdje se korisnički podaci spremaju u SOAP poruci i Http Coookiu. Svaki od thi načina ima neke prednosti i mane, a neki od njih su:

  Custom WCF auth (SSL) Forms auth (Cookie)
Za

- Sav promet ekriptiran, preko SSLa (https), sigurnost velika, nema cookia za ukrasti

- Jednostavna konfiguracija
- Mogućnost upotrebe gotovih atributa za WCF metode za presretanje prometa
- Radi sa Cassini web serverom (VS2010), lakše debugiranje
- TCP transport (višestruko brži od HTTP)
Protiv - Razvoj teži zbog potrebe punog IIS
- Debugiranje prometa (https promet se ne vidi jednostavno)
- Pad perfomansi zbog višestrukih handshake requestova (SSL), cca 5-20% manje req/sec
- TCP prijenos ne radi sa SSLom
- CSRF (cross site request forgery) napad, krađa cookia
- Sav promet lako vidljiv (packet snifferi,...)

Napredni načini bindanja i behaviora WCF servisa (queues, reliable sessions, transactions, message-level security, peer-to-peer messaging, drugi protokoli osim HTTP, HTTPS, TCP) u Silverlightu nisu dostupni zbog ograničenja sandbox modela rada unutar browsera, tako da se može koristiti samo basicHttpBinding (ili neke custom verzije, uz dodatno konfiguriranje). Više...

RIA, Web Dev »

[19 svi 2010 | 0 Comments]

Upravo sam potrošio 4 sata na traženje buga u jednoj Silverlight aplikaciji koju trenutno radim. Pošto sam na kraju ipak uspio pronaći u kojem zecu leži grm, i kako sam siguran da će netko osim mene doći do istog problema jer se radi o često korištenom obrascu ravzijanja, bilo bi dobro podjeliti ovaj mali tips&tricks koji može spasiti par sati uzaludnog traženja internetom (koje mene nije dovelo do rješenja ipak).

Bug izgleda ovako:

ovo je jedna kontrola u razvoju, i njezin zadatak je da ispisuje njezin status, dali je minimizirana i maksimizirana. To ispisuje ListBoxu, koji radi na sljedeći načim:

- na UserControl je postavljena DataContext klasa (MVVM pattern)
- ta ViewModel klasa ima jednu listu stringova definiranu kao ObservableCollection<string> property
- pomoći Binding sposobnosti, ažurirane vrijednosti u tom propertyu se automatski osvježavaju u ListBoxu, odnosno ispisuje lista tih stringova.
Primjer XAML deklaracije ListBoxa:


    
        
            
        
    


Bug je desi kada dodate više od 3-4 stringova u listu, i pokušate selektirati jednog, u ListBoxu će ostati selektirani, ili nasumično se selektirati više stavaka, kao što je prikazano u screenshotu (ListBox nema omogućeno selektiranje više od jedne stavke).. Više...

RIA, bizz »

[8 tra 2010 | 0 Comments]

I konačno, prvi windaysi na kojima ći prisustvovati u cijelosti (ne ono: evo ti ulaznica na 2 sata, poslje mi vrati jer te zamjenjuje kolega), i to u velikome stilu; sa druge strane šanka! Odnosno speaker pulta ili kako se već to zove. Naime, pred par mjeseci sam prijavio nekoliko tema za prezentaciju, uglavnom vezanih za ASP.NET MVC i Silverlight, nakon čega je programski odbor konferencije slučajno izabrao jednu predloženu prezentaciju: Silverligh RIA Services!

Mali uvod u Silverlight RIA Services, počevši od uvoda u ADO.NET Astoriu, kasnije nazvanu ADO.NET Data Services, pa opet preimenovanu u WCF Data Services (marketing odjel si svašta dopušta izgleda). U osnovi, radi se o izlaganju REST sučelja, čime se omoguće pretraživanje podataka kreiranjem posebnog URLa, te operacija nad podacima upotrebom Http metoda Get, Post, Put i Delete.

Za razliku od "standardnog" web servis upita nad određenom metodom ili procedurom (RPC-nalik upiti), u RESTu nema izloženih metoda koje se mogu pozvati, nego se upiti provode nad (hijerarhiskim) modelom podataka. Kako to izgleda u praksi:

1. kreiramo bazu, postavimo relacije
2. mapiramo bazu na objekte pomoću nekog ORM alata (EF, nHibernate, ...)
3. REST frameworku (WCF data services / RIA Services) kažemo da želimo izložiti taj model podataka
4. Upitom "http://domena.com/wcfdataservis.svc/Categories/121/Products?filter=Price gt 100" dobijemo spisak proizvoda u kategoriji sa ID-om 121 koji imaju cijenu veću od 100. Svega nekoliko klikova i par linija koda konfiguracije izmjenjeno, vrlo jednostavno! Primjetite da URL sadrzi sam upit, odnosno “adresu” podataka koji zelimo, zajedno sa dodatnim filtrom. Više...