di .NET e di altre amenità

TFS Permission Manager 1.0

Leon Langleyben ha rilasciato un tool che dovrebbe colmare un gap che ormai faceva sentire i suoi effetti. Si tratta di TFS Permission Manager 1.0 che ha lo scopo di gestire i permessi all'interno di progetti di Team Foundation Server. La gestione dei permessi di TFS è un problema rilevante cui già un altro progetto (TFSAdmin) aveva tentato di dare soluzione, senza però risolvere definitivamente la questione.

Link:

ASP.NET: Un ExpressionBuilder per semplificare la Membership

Ci sono molte attività ripetitive che si cerca di evitare il più possibile. Personalmente cerco sempre di usare al meglio gli strumenti del framework per semplificare anche le operazioni che pur se concettualmente semplici richiedono molta attenzione e perizia, proprio perchè sono le attività che più facilmente inducono in errore. Stamane ho realizzato un piccolo Expressionbuilder che ha lo scopo di semplificare l'applicazione dei permessi ai WebControls presenti in una pagina. Per chi non conosce gli ExpressionBuilder  un mio post che spiega il loro funzionamento. E qui sotto invece ho riportato il codice dell'ExpressionBuilder:

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Web.Compilation;
using System.CodeDom;

/// <summary>
/// Summary description for RolesExpressionBuilder
/// </summary>
public class RoleExpressionBuilder : ExpressionBuilder
{
    /// <summary>
    /// Determines whether the user is in the specified comma separated roles.
    /// </summary>
    /// <param name="commaSeparatedRoles">The comma separated roles.</param>
    /// <returns>
    /// <c>true</c> if user in role; otherwise, <c>false</c>.
    /// </returns>
    public static bool IsUserInRole(string commaSeparatedRoles)
    {
        string[] roles = commaSeparatedRoles.Split(',');

        bool result = false;

        foreach (string role in roles)
            result |= Roles.IsUserInRole(role.Trim());

        return result;
    }

    /// <summary>
    /// When overridden in a derived class, returns code that is used during page execution to obtain
        /// the evaluated expression.
    /// </summary>
    /// <param name="entry">The object that represents information about the property bound to
        /// by the expression.</param>
    /// <param name="parsedData">The object containing parsed data as returned by.</param>
    /// <param name="context">Contextual information for the evaluation of the expression.</param>
    /// <returns>
    /// A <see cref="T:System.CodeDom.CodeExpression"></see> that is used for property assignment.
    /// </returns>
    public override CodeExpression GetCodeExpression(
                BoundPropertyEntry entry, 
                object parsedData,
                ExpressionBuilderContext context)
    {
        CodeMethodInvokeExpression isUserInRoleMethod = new CodeMethodInvokeExpression();

        isUserInRoleMethod.Method.TargetObject = 
                    new CodeTypeReferenceExpression(typeof(RoleExpressionBuilder));
        isUserInRoleMethod.Method.MethodName = "IsUserInRole";
        isUserInRoleMethod.Parameters.Add(
                    new CodePrimitiveExpression(entry.Expression));

        return isUserInRoleMethod;
    }
}

La bellezza di queta tecnica è che si possono impostare i ruoli necessari per abilitare o nascodere i controlli in una pagina in modo completamente dichiarativo all'interno del markup delle pagine. Il codice così diventa più semplice da manutenere e si possono scrivere cose del genere:

<asp:Button ID="bOk" 
runat="server" 
Text="Ok" 
Visible="<%$ Roles: super, manager, user, guest, power %>" 
Enabled="<%$ Roles: super %>" />

Technorati tags: , ,

ASP.NET: Microsoft Anti-XSS Library

Microsoft ha pubblicato oggi una libreria realizzata per i programmatori che desiderano lavorare sul web in tutta sicurezza. La libreria in particolare è realizzata in modo da evitare attacchi di tipo Cross-Site Scripting, che ad oggi risultano molto diffusi soprattutto per effettuare phishing. La libreria consta di una assembly che al suo interno contiene una serie di classi che aiutano a fare l'encode del markup nei più svariati casi come Javascript e VBScript. A mio parere è molto utile a chi realizza WebControl custom.

Link:

Technorati tags: , ,

ASP.NET 2.0: VirtualPathProvider e Url Rewrite

Se qualcuno ha provato ad implementare un url rewrite ove già avesse utilizzato il VirtualPathProvider di ASP.NET forse si sarà già reso conto che ci sono alcuni problemi da tenere in considerazione. Innanzitutto bisogna tenere bene a mente come si comporta il runtime di ASP.NET quando compila le pagine. Poniamo ad esempio di avere una pagina ~/pippo.aspx, questa durante la compilazione darà luogo ad un assembly così denominato

App_Web_pippo.aspx.cdcab7d2.cdcaravs.dll

L'ultima parte del nome in realtà viene generata in modo casuale per evitare che possano esserci sovrapposizioni nei nomi. Questo pone un sottile problema. Nel caso di pagine di cui venga fatto il rewrite, mediante l'uso di una regular expression, come ormai abbastanza consueto, ci si può trovare di fronte al problema che venga compilato un assembly per ogni possibile combinazione di caratteri nel nome file. Ad esempio con un url fatto in questo modo:

~/articles/2837922.aspx

l'assembly diventerebbe

App_Web_2837922.aspx.cdcab7d2.cdcaravs.dll

Ma naturalmente ci sarebbe un assembly per ogni singolo articolo anche se in realtà la pagina che gestisce la visualizzazione è sempre la stessa. Personalmente mi sono trovato di fronte ad una condizione analoga implementando un VirtualPathProvider che mappa le pagine fisiche su un database. Per questo motivo alle fine ho dovuto implementare un rewrite in modo tale che l'url venisse mappato sempre e comunque su un nome pagina univoco, perchè solo in questo modo l'applicazione può essere fruibile.

Ora, dovendo realizzare un url rewriting la scelta è dovuta ricadere sull'uso di un HttpHandlerFactory per il semplice motivo che un rewrite implementato mediante HttpModule causa un comportamento anomalo della FormsAuthentication. Infatti, qualora si cerchi di accedere ad una pagina protetta, la FormsAuthentication effettua il redirect sulla pagina /login.aspx o su quella che è definita come tale in configurazione. A questo punto entra in gioco l'HttpModule che riscrive l'url convertendolo in qualcosa che tipicamente verrà riconosciuto dalla FormsAuthentication nuovamente come un url protetto e quindi avverrà dinuovo un redirect alla pagina di login causando un loop infinito.

L'unica soluzione che ho trovato è appunto realizzata mediante l'uso di una HttpHandlerFactory che però deve essere realizzata in modo molto particolare. In sostanza per realizzare questa factory occorre estendere la classe PageHandlerFactory - per inciso quella che normalmente intercetta le chiamate alle pagine aspx - perchè è proprio questa factory che contiene la logica relativa i VirtualPathProvider. Se si prova a scrivere un proprio HandlerFactory che faccia uso come di consueto del PageParser per creare l'istanza della pagina, il VirtualPathProvider non verrà più eseguito. Perciò ecco che l'unico sistema è quello di intervenire facendo l'override del metodo GetHandler() chiamando alla fine il metodo originale.

In questo modo potremo avere il meglio di entrambi i sistemi. Il VirtualPathProvider otterrà in input il virtualPath riscritto dal quale desumeremo la pagina da caricare, ma che sarà univoco e perciò darà luogo ad un solo assembly. D'altro canto l'HttpContext manterrà l'url originale e quindi saremo in grado di ingannare la FormsAuthentication e così evitare l'ingresso nel ciclo infinito nella login.

Appunti di WPF: SWF2XAML

Finalmente è arrivato! Era un po' di tempo che ci pensavo e che valutavo la possibilità di impegnarmi personalmente nell'impresa. Stamattina ho scoperto che naturalmente qualcuno lo aveva già pensato e oggi stesso ha pubblicato un utilissimo tool. , ha reso pubblico SWF2XAML, un tool che consente di scegliere una porzione di file SWF e convertirla a XAML. Certo, non è esattamente quello che mi aspettavo, ma credo che l'impresa di convertire un intero filmato in XAML sia un po' improbabile dato che flash fa un pesante uso di ActionScript per realizzare le animazioni più spinte.

Link:

Ottimizzare la compilazione dei progetti web con Visual Studio 2005

Ho scoperto un paio di post di , risalenti a Luglio e Settembre scorso che spiegano come evitare i problemi di lentezza nella compilazione dei progetti Web di Visual Studio 2005. In particolare nel mio caso ho risolto quello che Scott chiama "Dueling Assembly Reference" che mi obbligava ad attendere quasi due minuti la compilazione di una soluzione con solo 15 progetti. Se per caso anche a voi il compilatore pare soffermarsi un po' troppo nella fase di "Validating Web Site", è probabilmente venuto il momento di applicare il workaround descritto nei post linkati qui sotto.

Appunti di WPF: Ottimizzazione di collection 3D

Ecco un interessante post che spiega alcune tecniche per ottenere le migliori prestazioni nel trattare collection contenenti i vertici di mesh tridimensionali.

Link:

Appunti di WPF: ...e il codice prolisso.

Una cosa che ho sentito ripetere più e più volte durante questa WPC 2006 è che scrivere applicazione WPF con XAML è difficile perchè il codice è prolisso. Temo che questo possa diventare un luogo comune e per questo vorrei fare una piccola considerazione da sviluppatore web-oriented quale sono. Chi di voi ha mai provato per sfizio, oppure lo ha fatto sul serio per professione, sa bene che scrivere pagine web usando HTML è una'attività complessa e irta di ostacoli. HTML di suo è prolisso ma per questo nessuno mette in dubbio che si possa realizzare qualcosa di buono con esso, nonostante il problema dei differenti browser, dei css, degli standard e altre cosucce del genere.

E' vero, XAML è un po' prolisso e io per primo dico che spero al più presto esca qualcosa per semplificare, ma sono anche cosciente del fatto che fare un uso professionale di XAML, nonostante sia infinitamente più semplice e lineare di HTML richiederà spesso di abbandonare i tool e scrivere a mano. A me questo non spaventa... non capisco perchè spaventi gli altri.

WPC2006: Tutti a cena

Ed ecco la foto finale, gentilmente offerta da Riccardo Golia che ci ritrae tutti assieme durante la cena di ieri sera. Da sinistra verso destra:

Claudio Brotto, Andrea Saltarello, Corrado Cavalli, Riccardo Golia, Il sottoscritto, Roberto Restelli, Gabriele Del Giovine e Raffaele Rialdi

Un grazie a tutti per la compagnia fantastica.

 

 

 

 

WPC2006: Giorno 5

Virtualmente la WPC 2006 è finita per quanto mi riguarda. Gli argomenti di interesse in scaletta sono esauriti perciò è probabile che rimarrò allo stand Microsoft per vedere se incrocio qualche Veneto da istruire a proposito del nostro user group XeDotNet. Stamattina, nonostante la sonnolenza ho seguito le sessioni di Raffaele Rialdi a proposito di XPS e FlowDocument che mi ha aperto gli occhi su una parte di WPF che ancora non avevo affrontato e soprattutto mi ha convinto sul fatto che XAML in realtà è molto più che un semplice mark-up per definire interfacce, ma come ha dimostrato Raffaele è anche e soprattutto un ottimo modo per serializzare degli Object Model complessi con molta facilità. XPS poi è una grande novità che unita ai FlowDocument da la possibilità di costruire dei documenti completamente portabili e leggeri che hanno delle feature infinitamente superiori a quelle offerte da PDF. Basti ad esempio pensare al fatto che un file XPS altro non è che uno zip che contiene una serie di risorse cha fanno parte del documento.

Poi mi sono spostato verso la sessione di Andrea Saltarello che verteva sulla differenza sostanziale che esiste tra Object Oriented e Service Oriented. La sessione mi ha lasciato un po' di amarezza quando mi sono reso conto che dovrò rivedere alcune delle mie idee su SOA, in vista del futuro del progetto cui sto lavorando. Pazienza, l'importante è aver imparato qualcosa. Nella tarda mattinata, subito prima del pranzo vado a vedermi Raffaele nuovamente che assieme a Massimiliano Luciani parlerà di Advanced Perimeter Security... Chissà che cavolo significa... :-D

WPC2006: Giorno 4

Il quarto giorno di WPC è stato il più intenso. in realtà è da ieri pomeriggio che non riesco a fermarmi un minuto per scrivere due righe nel blog, ma confesso che ne è valsa la pena. Ieri, come testimoniato dalle foto pubblicate nel precedente post, ho passato il pomeriggio chiacchierando con Daniele Bocchicchio, Riccardo Golia e Raffaele Rialdi. Raffaele ci ha deliziato con le meraviglie delle Rainbow Table, la più piccola delle quali misura circa 2GB, ma he hanno la caratteristica di poter violare pressochè qualunque protocollo di sicurezza, a partire da LM e NTLM, con la magia della brute-force. Raffaele ci ha portato alcuni esempi inquietanti. Durante la sessione ad esempio hanno dimostrato che semplicemente inviando una mail confezionata in modo particolare si riesce a provocare la tentata autenticazione della vittima sulla propria macchina e in questo modo a sniffare l'hash delle credenziali che poi può essere agevolmente decodificato, al semplice costo del tempo di elaborazione.

Stamane, dopo un paio di sessine su Ajax da parte di Dino Esposito, che per la verità non mi hanno cambiato la vita, è toccato a Corrado Cavalli che attendevo praticamente dal primo giorno per vedere la sua prospettiva su Windows Presentation Foundation. Gli esempi hanno letteralmente lasciato il pubblico a bocca aperta come è normale aspettarsi da una piattaforma come WPF. Naturalmente rimane l'amarezza che trattandosi di una versione 1.0 in realtà le potenzialità siano piuttosto limitate per carenza di alcuni controlli che mancano rispetto a quello che ci si aspetta da Windows Forms 2.0. Tuttavità come ha rilevato Corrado, lo stesso gap lo hanno pagato le Windows Forms alla prima uscita del Framework .NET quando Visual Basic 6.0 aveva abituato a strumenti che non erano ancora disponibili per la nuova piattaforma.

Le serate stanno andando alla grande. Ieri ho cenato in compagnia di mezza dozzina di MVP, tra cui Alessandro Teglia e altri che non avevo mai conosciuto. Poi siamo passati in aula magna dove ci ha intrattenuto Claudio Lauretta (il Di Pietro di Markette). Stasera ancora non so cosa mi aspetta... ma so per certo che ci sarà da divertirsi.

 

WPC2006: Alcune foto

A richiesta ecco una della WPC, raccolte da Mighell. Io stavolta non ho portato la macchina... purtroppo.

La festa MVP due sere fa, a tavola con Andrea Saltarello, Lorenzo Barbieri e Mighell. Argomento principe naturalmente l'organizzazione di WPC 2006 che è stata curata nella parte dei contenuti da Andrea.

 

Naturalmente un appuntamento come WPC 2006 deve per forza di cose scontentare qualcuno, ma in definitiva dall'analisi di Andrea si evince che anche quest'anno l'obbiettivo è stato raggiunto.

 

 


Ieri pomeriggio, dato che le sessioni interessanti erano concluse ho approfittato per passare un po' di tempo con Daniele Bochicchio, Riccardo Golia e con Raffele Rialdi. Hanno dominato la discussione le problematiche di sicurezza e gli esempi portati da Raffaele di come con le Rainbow Tables e un po' di pazienza si possa più o meno entrare dappertutto. Perfino... no, questo non ve lo dico... ma credetemi che c'è da non crederci. Chissà poi quando ci ha provato Raffaele per essere così sicuro del risultato...

 

 

 


Non potevo non aprofittare della presenza di Corrado Cavalli per seguire le sue sessioni che ho scoperto essere di una chiarezza espositiva senza paragoni, e per scambiare due parole con lui a proposito di Windows Presentation Foundation. Naturalmente il problema che della mancanza di tool è sentito molto anche da lui che continua a ripetere anche durante le sessioni, "speriamo che ci pensino in fretta". Per il resto un pragmatismo molto salubre, che nvita a non rimanere indietro e cominciare a considerare da subito le nuove tecnologie per non essere impreparati quando il mercato comincerà ad esigerle.

 

 


Credo non serva aggiungere altro a questa immagine che si commenta da sola, salvo notare che, inspiegabilmente, è difficile concentrarsi sulle sessioni... non è vero Giancarlo? :-D

Un saluto a Claudia...

 

 

 

 

 

 

 


 Altre foto nella Gallery: http://blog.boschin.it/gallery/118.aspx