Magazine

WSE 3.0 ASP.net 2.0 Membership Integration

Davide Senatore

10/10/2006

Una delle caratteristiche più interessanti di ASP.net 2.0, la Membership API, può essere utilizzata anche dai Web Services per autenticare ed autorizzare un utente in un ambiente formato da applicazioni distribuite.

0%100%
per esprimere un voto è necessario registrarsi al sito

ASP.net, Web Services, Problematiche inerenti la sicurezza di sistemi distribuiti

WSE30MembershipIntegration.zip ()

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 StringByVal password As StringByVal email As StringByVal passwordQuestion As StringByVal passwordAnswer As StringAs 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 StringByVal 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 StringByVal password As StringByVal email As StringByVal passwordQuestion As StringByVal passwordAnswer As StringAs 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.ObjectByVal 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.ObjectByVal 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.ObjectByVal 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... 

 

Commenti
  • 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
Nome

Sito web
Commento


indietro