WSE 3.0 ASP.net 2.0 Membership Integration
Introduzione
L'autenticazione e l'autorizzazione di un utente sono ormai alla base di qualunque applicazione distribuita. Nel mio precedente articolo ho trattato una "Shared Membership" tra applicazioni ASP.net 2.0 che potesse essere di aiuto per realizzare un sistema Single-Sign-On (SSO) tra applicazioni web. Nell'articolo non è stata sondata la possibilità di utilizzare lo stesso pattern di autenticazione per un'applicazione Web Service ASP.net 2.0. In questo articolo andremo a valutare la possibilità di implementare la sicurezza di un'applicazione WEB Service utilizzando la Membership di ASP.net 2.0 come repository di utenti e ruoli e WSE 3.0 per l'infrastruttura di sicurezza e standardizzazione della comunicazione.
ASP.net 2.0 Membership e Role API
La versione 2.0 di ASP.net fornisce "out-of-the-box" un meccanismo di autenticazione ed autorizzazione basato su ruoli. Tale meccanismo è supportato da una ricca API creata per amministrare utenti e ruoli, che può essere utilizzata alternativamente facendo uso dei controlli già forniti da ASP.net 2.0, oppure "by hand" scrivendo un pò di codice ed approfondendo di fatto la nostra conoscenza della Membership API. Per approfondire la conoscenza di ASP.net 2.0 e dei meccanismi di autenticazione consiglio di leggere un buon libro o approfondire su MSDN.
Web Service Enhancements 3.0 (WSE 3.0)
I Web Services, all'epoca del loro rilascio ufficiale nella prima versione di .net 1.0, hanno subito fatto intuire le potenzialità che potevano offrire. L'unico ostacolo che si poteva trovare e che scoraggiava la loro adozione era una gestione della sicurezza non completa. Infatti, in principio era possibile creare solamente Web Services con autenticazione basata su windows, oppure facendo uso di tecniche basate sui SoapHeader. Non era disponibile nulla di standard che potesse rendere i web services effettivamente interoperabili anche dal punto di vista della sicurezza.
WSE, basati sulle specifiche WS-* del W3C, rappresentano il modo corretto di utilizzare attachments, Security, Messaging e Routing con Web Services, in modo da ottenere servizi effettivamente interoperabili. Siamo giunti alla versione 3.0 di WSE passando per le versioni 1.0 e 2.0 che hanno ogni volta rivisto abbondantemente i paradigmi dettati da W3C.
Oggi, con la versione 3.0, WSE rappresenta un framework per la sicurezza dei web services stabile e maturo, pronto per essere impiegato in Web Services da rendere addirittura interoperabili con Windows Communication Foundation. Noi impiegheremo WSE 3.0 per inviare le credenziali dell'utente al nostro Web Service, ma non scenderemo nel dettaglio della cifratura dei contenuti con certificati digitali, in quanto la tematica richiederebbe troppo spazio.
Obiettivi dell'implementazione
Vogliamo realizzare un'applicazione distribuita con un web service ed un'applicazione Smart Client che possa utilizzare le features offerte da questo Web Service in modo protetto e sicuro. Inoltre, gli utenti che si autenticheranno nella nostra applicazione faranno parte di una Membership, contenuta in un database SQL Server Express.
Come prima cosa, esaminiamo il servizio web. E' molto semplice e contiene, alcuni WebMethod che dovranno essere eseguiti sotto controllo di autorizzazione.
<WebService(Namespace:="http://tempuri.org/")> _
<WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Public Class Service
Inherits System.Web.Services.WebService
<WebMethod()> _
Public Function HelloWorld() As String
Return "Hello World"
End Function
<WebMethod()> _
Public Function CreateUser(ByVal name As String, ByVal password As String, ByVal email As String, ByVal passwordQuestion As String, ByVal passwordAnswer As String) As String
'Codice per la creazione di utenti
Dim _status As MembershipCreateStatus
Membership.CreateUser(name, password, email, passwordQuestion, passwordAnswer, True, _status)
Return _status.ToString()
End Function
<WebMethod()> _
Public Sub CreateRole(ByVal name As String)
'Codice per la creazione di un ruolo
Try
Roles.CreateRole(name)
Catch ex As Exception
Throw ex
End Try
End Sub
<WebMethod()> _
Public Sub AssignUserToRole(ByVal userName As String, ByVal roleName As String)
'Codice per l'assegnazione di un utente ad un ruolo
Try
Roles.AddUserToRole(userName, roleName)
Catch ex As Exception
Throw ex
End Try
End Sub
End Class
Se ora pubblicassimo questo servizio, qualunque utente, autenticato o no, potrebbe eseguire qualunque metodo. Questo non è quello che vogliamo. Allo scopo di autenticare l'utente, ci baseremo sul meccanismo più semplice, l'autenticazione Username Password. Queste credenziali dovranno poi essere passate per il controllo alla nostra Membership API, la quale ci saprà dire se l'utente è autenticato oppure no. Per far questo dovremo modificare un pò il Web Config e creare una classe Library (ma poteva anche essere una classe all'interno dello stesso progetto web) che implementi il nostro MembershipUserNameTokenManager.
<?xml version="1.0" encoding="utf-8"?>
<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">
<configSections>
<section name="microsoft.web.services3" type="Microsoft.Web.Services3.Configuration.WebServicesConfiguration, Microsoft.Web.Services3, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
</configSections>
<appSettings />
<connectionStrings>
<clear />
<add name="LocalSqlServer" connectionString="SERVER=DAVIDE\NETSDK;DATABASE=ASPNETDB;UID=sa;PWD=" providerName="System.Data.SqlClient" />
</connectionStrings>
<system.web>
<compilation debug="true" strict="false" explicit="true">
<assemblies>
<add assembly="Microsoft.Web.Services3, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
...
</assemblies>
</compilation>
...
<webServices>
<soapExtensionTypes>
</soapExtensionTypes>
<soapServerProtocolFactory type="Microsoft.Web.Services3.WseProtocolFactory, Microsoft.Web.Services3, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
<soapExtensionImporterTypes>
<add type="Microsoft.Web.Services3.Description.WseExtensionImporter, Microsoft.Web.Services3, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
</soapExtensionImporterTypes>
</webServices>
<roleManager enabled="true"></roleManager>
</system.web>
<microsoft.web.services3>
<diagnostics>
<trace enabled="true" input="InputTrace.webinfo" output="OutputTrace.webinfo" />
</diagnostics>
<security>
<securityTokenManager>
<add type="WSE30Security.MembershipUserNameTokenManager, WSE30Security" namespace="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" localName="UsernameToken" />
</securityTokenManager>
</security>
<policy fileName="wse3policyCache.config" />
</microsoft.web.services3>
</configuration>
Le cose da dire e vedere sarebbero moltissime, ma le lascio come approfondimento, tranne una. Notiamo all'interno del tag securityTokenManager, il nome di una classe e di un assembly che forniranno lo strato di validazione delle credenziali. In pratica questo assebly sarà rappresentato dalla class library e la classe MembershipUserNameTokenManager ereditando da UserNameTokenManager, implementerà la logica di validazione delle credenziali utente, come possiamo vedere nello snippet seguente:
Public Class MembershipUserNameTokenManager
Inherits UsernameTokenManager
Public Sub New()
End Sub
Public Sub New(ByVal nodes As XmlNodeList)
MyBase.New(nodes)
End Sub
Protected Overrides Function AuthenticateToken(ByVal token As Microsoft.Web.Services3.Security.Tokens.UsernameToken) As String
Dim validCredentials As Boolean = Membership.ValidateUser(token.Username, token.Password)
If validCredentials Then
'Creo un oggetto Identity
Dim identity As GenericIdentity = New GenericIdentity(token.Username)
'Creo un Generic Principal e lo popolo con i ruoli presi dalla Role API
Dim principal As GenericPrincipal = New GenericPrincipal(identity, Roles.GetRolesForUser(token.Username))
'Imposto l'oggetto principal al token
token.Principal = principal
'Ritorno la password (standard pattern WSE)
Return token.Password
Else
'Ritorno nothing
Return Nothing
End If
End Function
End Class
Spero che il codice sia sufficientemente auto-esplicativo. L'unico punto oscuro, se non si ha molta dimestichezza con WSE, è l'impostazione dell'oggetto principal sul token. Ora, ritornando al nostro Web Service, vediamo come dobbiamo modificarlo e cosa si può effettivamente ottenere con questo pattern di autenticazione. Ricordo che prima viene invocato lo UsernameTokenManager, poi viene creata la classe del servizio web, ed infine viene eseguito il Web Method richiesto.
<WebService(Namespace:="http://tempuri.org/")> _
<WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
<Policy("UsernameTokenSecurity")> _
Public Class Service
Inherits System.Web.Services.WebService
Public Sub New()
If RequestSoapContext.Current IsNot Nothing Then
System.Threading.Thread.CurrentPrincipal = RequestSoapContext.Current.IdentityToken.Principal
Context.User = RequestSoapContext.Current.IdentityToken.Principal
End If
End Sub
<WebMethod(), PrincipalPermission(SecurityAction.Demand, Role:="Greeters")> _
Public Function HelloWorld() As String
Return "Hello World"
End Function
<WebMethod(), PrincipalPermission(SecurityAction.Demand, Role:="Administrators")> _
Public Function CreateUser(ByVal name As String, ByVal password As String, ByVal email As String, ByVal passwordQuestion As String, ByVal passwordAnswer As String) As String
'Codice per la creazione di utenti
Dim _status As MembershipCreateStatus
Membership.CreateUser(name, password, email, passwordQuestion, passwordAnswer, True, _status)
Return _status.ToString()
End Function
'... snip...
End Class
Ecco quindi come viene gestita la chiamata di un Web Method messo "in sicurezza". Nel New del WS utilizzo l'oggetto principal memorizzato nel token nello strato di validazione delle credenziali per impostare l'oggetto principal del thread corrente e l'utente del contesto http corrente. In questo modo ottengo la possibilità, a parer mio eccezionale, di utilizzare la sicurezza dichiarativa a livello di Web Method. Alternativamente ho comunque la possibilità di utilizzare la sintassi User.IsInRole(...) per ottenere una autorizzazione imperativa. Altra cosa da notare: all'interno di uno stesso Web Service ci sono metodi eseguibili da alcuni ruoli e metodi eseguibili da altri; ad esempio, la creazione di un utente può essere fatta solo da utenti appartenenti al ruolo Administrators. Per approfondimenti consultate l'esempio incluso nell'articolo. Sono state volutamente tralasciate le problematiche riguardanti le policy di WSE 3.0. Per approfondimenti, scaricate gli Hands On Lab - Security disponibili qui. Ovviamente è necessario anche scaricare WSE 3.0. Il pacchetto di installazione lo potete trovare qui.
Windows Forms Smart Client
Il client è volutamente molto semplice e permette solamente di invocare due metodi: HelloWorld e CreateRole. Il primo può essere invocato dal ruolo Greetes mentre il secondo solo dal ruolo Administrators. Se create un database ASPNETDB con dei ruoli ed alcuni utenti di prova, potrete effettivamente vedere come il pattern proposto sia estremamente facile da configurare e completamente trasparente ai fini dello sviluppo. Il corpo della form dell'applicazione web è il seguente:
Dim _proxy As WSEClientApp.localhost.ServiceWse
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
'Questa chiamata funzionerà solo se l'utente fa parte del gruppo Greeters
Try
MessageBox.Show(_proxy.HelloWorld())
Catch ex As System.Web.Services.Protocols.SoapHeaderException
If String.Compare(ex.Code.Name, "FailedAuthentication", True) = 0 Then
MessageBox.Show("Le credenziali fornite non possono essere autenticate!", "Errore di autenticazione", MessageBoxButtons.OK, MessageBoxIcon.Error)
End If
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End Sub
Private Sub btnCreateRole_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCreateRole.Click
Try
_proxy.CreateRole(txtRoleName.Text)
Catch ex As System.Web.Services.Protocols.SoapHeaderException
If String.Compare(ex.Code.Name, "FailedAuthentication", True) = 0 Then
MessageBox.Show("Le credenziali fornite non possono essere autenticate!", "Errore di autenticazione", MessageBoxButtons.OK, MessageBoxIcon.Error)
End If
Catch ex As System.Web.Services.Protocols.SoapException
MessageBox.Show(ex.Message)
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End Sub
Private Sub btnSetProxy_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSetProxy.Click
_proxy = New WSEClientApp.localhost.ServiceWse
'Assertion Technique
Dim _assertion As New UsernameOverTransportAssertion
_assertion.UsernameTokenProvider = New UsernameTokenProvider(txtLogin.Text, txtPassword.Text)
_proxy.SetPolicy(New Policy(_assertion))
End Sub
Ovviamente il pattern dei gestione delle eccezioni dovrebbe essere reso più flessibile, magari incapsulandolo in alcune classi helper. La funzione centrale è comunque costituita dall'impostazione della policy, questa volta in modo imperativo, con il nome utente e la password desiderati. Un'osservazione è d'obbligo: utilizzando queste nozioni e quelle esposte nel mio precedente articolo è assolutamente possibile creare un "application garden", ovvero un insieme di applicazioni web eterogenee, ASP.net e Web Services, che condividano utenti e ruoli, accentrando così la gestione della sicurezza in un unico punto.
Conclusioni
Siamo riusciti a vedere come sia possibile utilizzare le credenziali di un utente contenute in un repository pensato per essere utilizzato da Membership e Role API in un Web Service messo in sicurezza tramite WSE 3.0. In uno scenario di applicazioni distribuite, questo può essere molto appetibile, in quanto è possibile accentrare completamente la gestione di utenti e ruoli in modo da uniformare gli accessi e dare agli utenti del sistema un'unica identità da utilizzare in tutta l'infrastruttura distribuita. E' necessario, comunque, fare molta attenzione al fatto che le comunicazioni non sono criptate, ovvero le credenziali dell'utente passano in chiaro "on the wire". Le possibilità per criptare le informazioni vanno dall'utilizzo di certificati digitali con WSE 3.0 all'utilizzo di un canale https protetto.
Ma questa, è un'altra storia...
-
http://alcohol-18.zenavo.cn http://herbal-7-371.zipace.cn http://loxitane.zostura.cn http://plan-b-84.zuvexry.cn http://nurses-6.zostura.cn http://multiple-sclerosis-1-190.zostura.cn http://breast-augmentation.zenavo.cn http://health-76.zipace.cn http://clonazepam.zenavo.cn http://zuvexry.cn http://speed-7.zyreloj.cn http://cytadren-516.zenavo.cn http://phentrimine.zuvexry.cn http://astemizole.zenavo.cn http://health-85.zipace.cn http://zuvexry.cn
http://repaglinide.zuvexry.cn
di
Agatha
-
23/10/2008 13.43.55
-
http://usedgearhobbers.blog.com http://mercedesallstatecarinsurancecarinsurance.blog.com http://hondapreludebodykituk.blog.com http://3500dodgewiperrepair.blog.com http://carhireitalymonterotondoscalouk.blog.com http://easteroffersrentcarmunichgermany.blog.com http://fordmotorcompanynorfolk.blog.com http://carforsaleprincegeorge.blog.com http://ironusedtractors.blog.com http://sstsupercars.blog.com http://usedfisherinsturmentation.blog.com http://1997fordexplorertransmission.blog.com http://bookstoreandusedandtechnical.blog.com http://autoandtrucktraderillinois.blog.com http://busnewusedwholesale.blog.com http://fordstrokerdynotest.blog.com
http://lincolntechlincolnri.blog.com
di
Amabel
-
05/11/2008 15.57.31
-
http://2000pontiacgrandprixpart.blog.com http://volvodealersinlehighvalleypa.blog.com http://94gmctruck4x4seat.blog.com http://pullmancarphotograph.blog.com http://motorcyclesalestnused.blog.com http://2005fivefordhundredspoiler.blog.com http://metalfullautoairsoftguns.blog.com http://kennybrackracecardrivercrash.blog.com http://cadillaccowboycrissleadoux.blog.com http://accessorycarsingaporetoyota.blog.com http://carfinanceloanmortgageusus.blog.com http://jobsdeliveringcars.blog.com http://usedmazdapickupinthailand.blog.com http://usedcarsindividualsellers.blog.com http://dangercarramppit.blog.com http://nissanandspokane.blog.com http://1931marmontowncar.blog.com http://1930scommunicationusedin.blog.com http://2007volkswagenrabbitsstpetersburgfl.blog.com http://motorcargrandpageautomobile.blog.com
http://usedcarsaloneinterstate95.blog.com
di
Mildred
-
05/11/2008 15.57.32
-
http://notasportskitracecars.blog.com http://2008carshow.blog.com http://1990dodgeramfactoryaxleratio.blog.com http://autorepairkacksonvillefloridaerikherman.blog.com http://centerconsolejeepsubwooferwrangler.blog.com http://rangeroverstretch.blog.com http://2000dodgeintrepidhightonehorn.blog.com http://allanshondamotorcyclesbelfast.blog.com http://edmandscars.blog.com http://sstsupercars.blog.com http://1973jeepcj5bodyparts.blog.com http://mercedesbenzworldracingcars.blog.com http://jamesrfordsaid.blog.com http://fordseatbelts.blog.com http://replace2000dodgedakotadiesel.blog.com http://astonbondcarjamesmartin.blog.com http://2004autoshowcars.blog.com
http://usedboxtruckssaleshouston.blog.com
di
Ella
-
05/11/2008 15.57.45
-
http://contest-14.iwaivy.cn http://i75.huqseq.cn http://reviews-6.ikiqomy.cn http://marquette-2.jiculan.cn http://40d.ejiycu.cn http://consort.iwaivy.cn http://names-24.jigzayp.cn http://huqseq.cn http://ms-6.icuyjen.cn http://apd.fobuqe.cn http://girl-88.ivyikfe.cn http://distributors-4.hakiwut.cn http://president-15.emeacog.cn http://printable-1.ihiavyw.cn http://la-127.jemunqy.cn
http://sunday-3.imazeq.cn
di
Jeremiah
-
11/11/2008 14.04.22
-
http://supply-3.imazeq.cn http://control-7.iwaivy.cn http://constraints.godyvif.cn http://directions-8.hakiwut.cn http://myers-7.icuyjen.cn http://family-80.izoated.cn http://lake-25.jemunqy.cn http://movie-35.hovqaxy.cn http://silver-32.ikiwagu.cn http://409.ejiycu.cn http://where-42.iqudyc.cn http://page-55.elixyem.cn http://la-86.jemunqy.cn http://charle-10.fyxowy.cn http://tribune-3.imogesu.cn http://richard-19.ikiqomy.cn
http://exyawy.cn
di
Paulina
-
11/11/2008 16.50.55
-
http://disney-23.hakiwut.cn http://reward-5.ikiqomy.cn http://booby-1.fugicop.cn http://move-8.icuyjen.cn http://where-24.iqudyc.cn http://hotel-85.hovqaxy.cn http://image-10.jajozil.cn http://iwaivy.cn http://paphos.elixyem.cn http://discharge.hakiwut.cn http://cookies-4.iwaivy.cn http://wheels-7.iqudyc.cn http://girls-22.ejonayz.cn http://grant-24.iguiqry.cn http://presidential-5.emeacog.cn http://huqseq.cn
http://car-89.ivyikfe.cn
di
Amy
-
11/11/2008 16.51.36
-
http://travelling.imogesu.cn http://resurfacing.emoelxu.cn http://pari-14.iguocew.cn http://fanlisting.izoated.cn http://rhino-2.ikiqomy.cn http://home-94.hovqaxy.cn http://mar-13.jiculan.cn http://proces-10.ihiavyw.cn http://car-80.ivyikfe.cn http://priority-1.ihiavyw.cn http://extension-4.hogdid.cn http://boxes-10.fugicop.cn http://chapter-6.fyxowy.cn http://triangle-3.imogesu.cn http://my-65.jigzayp.cn
http://car-26.ivyikfe.cn
di
Tessa
-
11/11/2008 16.51.38
-
http://shiva.emyboik.cn http://jafcyp.cn http://hotel-47.hovqaxy.cn http://dog-110.iweohti.cn http://price-89.emeacog.cn http://resources-5.emoelxu.cn http://job-32.hovqaxy.cn http://subsystem.imazeq.cn http://arabic.fobuqe.cn http://jafcyp.cn http://glass-66.ejonayz.cn http://restaurant-84.emoelxu.cn http://condition-4.godyvif.cn http://transfer-4.exyawy.cn http://channell.fyxowy.cn http://fact-12.izoated.cn http://myths-1.icuyjen.cn http://godyvif.cn http://marcy-1.jiculan.cn
http://klub.hyzheuv.cn
di
Doris
-
11/11/2008 16.51.38
-
http://web-4.fijsoqa.cn http://ikiqomy.cn http://municipal.icuyjen.cn http://shortcut-1.ikiwagu.cn http://manga-6.ibikyed.cn http://does-13.iweohti.cn http://chemically.ejiycu.cn http://icbc.huqseq.cn http://transcontinental.exyawy.cn http://supply-14.imazeq.cn http://bradford-4.fugicop.cn http://triste.imogesu.cn http://passat.iguocew.cn http://westland.iqudyc.cn http://fijsoqa.cn http://shipwrecks.emyboik.cn http://treatments.imogesu.cn
http://kit-23.hyzheuv.cn
di
Winnie
-
12/11/2008 2.23.08
-
http://resolution.emoelxu.cn http://map-152.jiculan.cn http://shower-30.ikiwagu.cn http://marine-4.jiculan.cn http://cheerleading-3.ejiycu.cn http://books-7.fugicop.cn http://conklin.godyvif.cn http://baby-67.ifoyce.cn http://congress-5.godyvif.cn http://traumatic.imogesu.cn http://trail-27.exyawy.cn http://are-80.iroyha.cn http://fargo-4.izoated.cn http://boulder.fugicop.cn http://iweohti.cn http://goods-6.iguiqry.cn http://bridesmaid-1.isypouc.cn
http://gloss.ejonayz.cn
di
Pete
-
12/11/2008 3.57.58
-
http://botswana-1.fugicop.cn http://pagina-1.elixyem.cn http://show-60.ikiwagu.cn http://mp3-104.jafcyp.cn http://murder-15.icuyjen.cn http://muse.icuyjen.cn http://printer-10.ihiavyw.cn http://grady-1.iguiqry.cn http://ihc.jajozil.cn http://bridge-17.isypouc.cn http://6230.ifoyce.cn http://male-9.ibikyed.cn http://braunschweig.isypouc.cn http://arm-23.iroyha.cn http://chiller.ivyikfe.cn http://imperium.jajozil.cn http://kitchen-18.hyzheuv.cn http://dog-76.iweohti.cn
http://summer-7.imazeq.cn
di
Lazarus
-
12/11/2008 3.58.04
-
http://grand-34.iguiqry.cn http://mussel.icuyjen.cn http://wheel-26.iqudyc.cn http://trash-2.exyawy.cn http://document.iweohti.cn http://hydrogen-2.huqseq.cn http://hunter-20.huqseq.cn http://part-142.iguocew.cn http://para-9.iguocew.cn http://confrence.godyvif.cn http://lyric-21.hovqaxy.cn http://goods-4.iguiqry.cn http://awm.ifoyce.cn http://marteen.jiculan.cn http://prichard.emeacog.cn http://knoll.hyzheuv.cn http://korean-4.hyzheuv.cn
http://shoes-5.emyboik.cn
di
Ray
-
12/11/2008 3.58.09
-
http://md-56.ogulad.cn http://tx-11.kekuhja.cn http://background-1.jitonxe.cn http://ricky-3.jympeha.cn http://graphic-33.jobumwy.cn http://swim-12.kavqyre.cn http://pronounced-53.jyhlax.cn http://cool-15.kyxzouq.cn http://surgery-20.kavqyre.cn http://lyrics-71.lodiber.cn http://grow-9.jobumwy.cn http://news-37.ojiosta.cn http://fire-24.ofiaved.cn http://groceries.jobumwy.cn http://site-7.jyqifwo.cn http://tube-3.kekuhja.cn http://mamulhi.cn http://73.jitonxe.cn
http://produces.jyhlax.cn
di
Flo
-
12/11/2008 13.39.12
-
http://window-26.notriqa.cn http://ofonem.cn http://surefire.kavqyre.cn http://market-27.lykibso.cn http://switch-7.kavqyre.cn http://tyrosine.nihotra.cn http://cost-6.kyxzouq.cn http://christain-1.kyhzuga.cn http://butane.odapizo.cn http://swiss-2.kavqyre.cn http://brother-26.kygfaq.cn http://greco.jobumwy.cn http://brutal-1.odapizo.cn http://book-7.kygfaq.cn http://snopes.mufmyp.cn http://site-27.jyqifwo.cn http://cracker-4.ofauxi.cn http://mary-41.lykibso.cn http://buffalo-5.odapizo.cn http://infinite-1.lumzile.cn
http://unlocker.nihotra.cn
di
Olivia
-
12/11/2008 13.39.29
-
http://md-56.murdeva.cn http://association-16.iwudaj.cn http://nh-30.nidugen.cn http://tallahassee-1.iboasli.cn http://cornhusker.emuowav.cn http://psoriasis-1.gojquez.cn http://drivers-24.jonygje.cn http://fishing-41.jubleyc.cn http://bussines-1.ixiwyot.cn http://industrial-10.ewouzty.cn http://wild-10.daxfiuz.cn http://psycho-1.gojquez.cn http://hepikyr.cn http://book-141.ebisauw.cn http://purcellville.gojquez.cn http://patti-1.apyuhbo.cn http://protein-2.gojquez.cn http://nebraska-21.fabdys.cn http://atomic-4.adaone.cn
http://wiz.imehyb.cn
di
Romeo
-
06/12/2008 12.32.01
-
http://surge.cyhdevu.cn http://willam.daxfiuz.cn http://uniform-1.ikoapni.cn http://las-41.ewuomny.cn http://fingerprints.jubleyc.cn http://coverage-6.javleg.cn http://christopher-11.eliwuax.cn http://pdf-14.fetruih.cn http://mechanic.murdeva.cn http://product-32.aviejcy.cn http://financial-24.jubleyc.cn http://soccer-16.hepikyr.cn http://learning-11.mudtyha.cn http://newsletter-7.nidugen.cn http://counties-3.javleg.cn http://pronounced-67.aviejcy.cn http://dong.epualbe.cn http://program-38.aviejcy.cn http://downstairs.epualbe.cn
http://corportation.emuowav.cn
di
Meredith
-
07/12/2008 4.42.57
-
http://tan-7.iboasli.cn http://massage-15.exuole.cn http://assessor-4.dymdob.cn http://rolls-3.gymegar.cn http://sniffer.hepikyr.cn http://academic.faxroty.cn http://newspaper-13.nidugen.cn http://chord-16.eliwuax.cn http://online-4.evahuyq.cn http://winter-15.imehyb.cn http://instant.lafsozi.cn http://rock-7.avyreos.cn http://leander.mudtyha.cn http://window-15.imehyb.cn http://cisco-2.izuohu.cn http://back-5.adaone.cn http://rimming.avyreos.cn http://learn-1.mudtyha.cn http://mechanic-5.murdeva.cn http://instruments-4.lafsozi.cn
http://sweats.cyhdevu.cn
di
Jen
-
07/12/2008 4.42.57
-
http://live-15.nitelzu.cn http://ellen-3.ifaoqpy.cn http://pizzeria.aqahoyl.cn http://out-54.ovuhoyf.cn http://columbia-17.widugbe.cn http://redheaded.asivyde.cn http://ministries-6.ogayjy.cn http://election-7.ifaoqpy.cn http://2006-38.onotaze.cn http://pon.pedmyix.cn http://178.onotaze.cn http://video-10.otegaoz.cn http://bates.fylgaoj.cn http://vans-3.eceukzo.cn http://dark-3.iduhail.cn
http://gay-40.otegaoz.cn
di
Sylvester
-
12/12/2008 13.44.51
indietro