Tech, Web Dev »

[8 ruj 2010 | 0 Comments]

Ovo je prvi u nizu, nadam se, brojnih kratkih pregleda open source .NET alata, frameworka, toolkitova, i svega što može poslužiti, korisno ili beskorisno!

Prvi prezentirani alat je Automapper. Radi se jako korisnom frameworku za kopiranje vrijednosti iz jednog objekta u drugi. Osim osnovnog kopiranja propertya po propertya, postoje brojni načini konfiguracije koji omogućuju složene manipulacije nad podacima, a fluent interface DSL način konfiguriranja je intuitivan i relativno jednostavan za podesiti.

Najčešći scenarij u kojemu ja upotrebljavam AutoMapper je kopiranje vrijednosti iz domenskih entiteta (sa učitanim podacima iz baze) u DTO objekte koji reprezentiraju prikaz podataka na web stranici ili windows/Silverlight formi.

Najjednostavniji primjer je kopiranje prema konvenciji, što znači da će Automapper tražiti propertye sa istim imenima:

Public class Article
{
	public int ID { get; set; }
	public string Name { get; set; }
}

Public class ArticleDTO
{
	public int ID { get; set; }
	public string Name { get; set; }
}

AutoMapper.Mapper.CreateMap<Article , ArticleDTO>();

var article = new Article() {ID = 1, Name = "some name"};

var dto = new ArticleDTO();

AutoMapper.Mapper.Map(article, dto);

Malo složenija i češća upotreba je flattening, ili pretvaranje grafa objekata u jedan objekt, uz primjenu ValueResolvera za konverziju tipa podataka:

public class Person
{
	public string Name { get; set;}
	public Address Address { get; set; }
	public bool IsMale { get; set; }
}

public class Address
{
	public string StreetName { get; set;}
	public int Number { get; set;}
}

public class PersonDTO
{
	public string Name { get; set;}
	public string LivingAddress { get; set;}
	public string Gender { get; set; }
}

public class GenderConverter : ValueResolver<bool,string>
{
	protected override string ResolveCore(bool source)
	{
		return source ? "Male" : "Female";
	}
}

var person = new Person() 
	{ Name = "Hudo", Address = new Address() {StreetName = "Sezam", Number = 1, IsMale=true}  };

AutoMapper.Mapper.CreateMap<Person , PersonDTO>()
	// kopiranje ulice i broja iz objekta Address u jedan property
	.ForMember(
	d => d.LivingAddress, 
	s => s.MapFrom(x => x.Address.StreetName + " " + x.Address.Number))
	// konverzija iz bool u string
	.ForMember(
	d=>d.Gender,
	s=>s.ResolveUsing<GenderConverter>().FromMember(x=>x.IsMale));

var dto = new PersonDTO();

AutoMapper.Mapper.Map(person, dto);

Ostali primjeri se mogu pronaći na Codeplexu (http://automapper.codeplex.com/) i naravno, Googlu.

quick thoughts, bizz »

[23 kol 2010 | 0 Comments]

kulendayz2010_small

Od 3. do 5. rujna se u Belom Manastiru kraj Osijeka održava godišnja konferencija u organizaciji MS Community Osijeka. Osim stručnih i zanimljivih predavanja podijeljenih u nekoliko trackova, prilično visoke tehničke razine (level 300, 400, za programere, sistemaše i db admine), glavninu konferencije čini druženje sudionika, od zajedničkih većeri, zabava, do izleta u Kopački rit i mogućih rekreakcijskih aktivnosti.
Jako me veseli moje ovogodišnje prvo sudjelovanje na ovoj konferenciji, prvenstveno zbog druženja sa poznatim njuškama u domaćnoj .NET zajednici i susreta sa prijateljima, te nadam da stjecanju novih znanja (planiram izvući iz predavaća sve informacije o projektima na kojim rade i sa kojom tehnologijom i kako, kada budu pijani, ali nemojte im to reći!)
I da, konferencija je besplatna, samo se pobrinete da dođete do tamo, i sredite si smještaj!

http://kulendayz.mscommunity.net/

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...