<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://msmvps.com/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><title type="html">Raffaele</title><subtitle type="html">Raffaele Rialdi weblog</subtitle><id>http://msmvps.com/blogs/raffaele/atom.aspx</id><link rel="alternate" type="text/html" href="http://msmvps.com/blogs/raffaele/default.aspx" /><link rel="self" type="application/atom+xml" href="http://msmvps.com/blogs/raffaele/atom.aspx" /><generator uri="http://communityserver.org" version="4.1.40407.4157">Community Server</generator><updated>2006-11-29T02:05:00Z</updated><entry><title>Programmatically creating the WCF certificate identity tag</title><link rel="alternate" type="text/html" href="/blogs/raffaele/archive/2009/09/10/programmatically-creating-the-wcf-certificate-identity-tag.aspx" /><id>/blogs/raffaele/archive/2009/09/10/programmatically-creating-the-wcf-certificate-identity-tag.aspx</id><published>2009-09-10T20:27:48Z</published><updated>2009-09-10T20:27:48Z</updated><content type="html">&lt;p&gt;SvcUtil let you automatically create the client configuration for a WCF service.&lt;/p&gt; &lt;p&gt;When you use a certificate on the server side, its public key is encoded in Base64 in the client web.config.&lt;/p&gt; &lt;div style="border-bottom:gray 1px solid;border-left:gray 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;max-height:200px;font-size:8pt;overflow:auto;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;padding-top:4px;"&gt; &lt;div style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   1:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;identity&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   2:&lt;/span&gt;      &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;certificate&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;encodedValue&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;AwAAAA ....&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   3:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;identity&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Obviously SvcUtil create this information from metadata (wsdl).&lt;/p&gt;
&lt;p&gt;Unfortunately there are cases where the service configuration is complex and you cannot enable mex endpoint easily. I had this problem when moving a WCF project from the desktop PC to the notebook and finally deploying.&lt;/p&gt;
&lt;p&gt;The solution &lt;strong&gt;&lt;u&gt;seems&lt;/u&gt;&lt;/strong&gt; very simple:&lt;/p&gt;
&lt;div style="border-bottom:gray 1px solid;border-left:gray 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;max-height:200px;font-size:8pt;overflow:auto;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;padding-top:4px;"&gt;
&lt;div style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   1:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; GetEncoded(X509Certificate2 cert)&lt;/pre&gt;&lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   2:&lt;/span&gt; {&lt;/pre&gt;&lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   3:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;byte&lt;/span&gt;[] export = cert.Export(X509ContentType.SerializedCert);&lt;/pre&gt;&lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   4:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; encoded = Convert.ToBase64String(export);&lt;/pre&gt;&lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   5:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; encoded;&lt;/pre&gt;&lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   6:&lt;/span&gt; }&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Please don&amp;#39;t do this at home :) ... this value is correct in many cases but for many other has a &lt;strong&gt;&lt;u&gt;very dangerous side-effect&lt;/u&gt;&lt;/strong&gt;. Export method exports a certificate in its whole. This means that if the certificate was installed with the &lt;strong&gt;&lt;u&gt;private key&lt;/u&gt;&lt;/strong&gt;, the export method write it too! For the sake of completeness, when you install a certificate you can choose to install the private key or not.&lt;/p&gt;
&lt;p&gt;Certainly the private key should never go on a client machine, it would be like giving away your home keys to a stranger. GetEncoded method is correct but it writes too much information. We have to strip the certificate from the private key before exporting it.&lt;/p&gt;
&lt;p&gt;So I digged the best way to strip the private key from the certificate. After some tests, I asked to a dear friend &lt;a href="http://blogs.msdn.com/mariofontana/"&gt;Mario Fontana&lt;/a&gt; (some CAPICOM stuff comes from his fingers) that remembered me that the DER format (the one that contains only the public key) can be obtained simply exporting the certificate with the parameter &amp;quot;X509ContentType.Cert&amp;quot;.&lt;/p&gt;
&lt;div style="border-bottom:gray 1px solid;border-left:gray 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;max-height:200px;font-size:8pt;overflow:auto;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;padding-top:4px;"&gt;
&lt;div style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;height:16px;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   1:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;byte&lt;/span&gt;[] der = certRaf.Export(X509ContentType.Cert); // solo &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; key&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;This is not sufficient since we absolutely need to export with SerializedCert parameter. The solution is easy: re-import the certificate.&lt;/p&gt;
&lt;div style="border-bottom:gray 1px solid;border-left:gray 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;max-height:200px;font-size:8pt;overflow:auto;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;padding-top:4px;"&gt;
&lt;div style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   1:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; X509Certificate2 ImportFromBlob(&lt;span style="color:#0000ff;"&gt;byte&lt;/span&gt;[] certBlob)&lt;/pre&gt;&lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   2:&lt;/span&gt; {&lt;/pre&gt;&lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   3:&lt;/span&gt;     X509Certificate2Collection certs = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; X509Certificate2Collection();&lt;/pre&gt;&lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   4:&lt;/span&gt;     certs.Import(certBlob);&lt;/pre&gt;&lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   5:&lt;/span&gt;     X509Certificate2 imported = certs[0];&lt;/pre&gt;&lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   6:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; imported;&lt;/pre&gt;&lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   7:&lt;/span&gt; }&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;The final step is obvious. Export the certificate obtained from the &amp;quot;ImportFromBlob&amp;quot; method using &amp;quot;GetEncoded&amp;quot; at the top of this post.&lt;br /&gt;We now have the magic string used in the client WCF configuration.&lt;/p&gt;
&lt;p&gt;Pay attention, this procedure is not &amp;quot;optional&amp;quot;. Giving away a private key is the worst thing in security you can do.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1722427" width="1" height="1"&gt;</content><author><name>raffaele</name><uri>http://msmvps.com/members/raffaele/default.aspx</uri></author></entry><entry><title>My TechEd interview has gone live</title><link rel="alternate" type="text/html" href="/blogs/raffaele/archive/2008/02/13/my-teched-interview-has-gone-live.aspx" /><id>/blogs/raffaele/archive/2008/02/13/my-teched-interview-has-gone-live.aspx</id><published>2008-02-13T13:19:14Z</published><updated>2008-02-13T13:19:14Z</updated><content type="html">&lt;p&gt;During the last TechEd developers in Barcelona, I was at the Ask The Expert in the Security Development Lifecycle booth with the SDL team and Michael Howard in person.&lt;br /&gt; I had the chance to be interviewed in the &lt;a href="http://www.virtualteched.com/Pages/default.aspx"&gt;Fishbowl&lt;/a&gt;, as a Threat Modeling expert.&lt;/p&gt; &lt;p&gt;&lt;img height="296" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/raffaele/WindowsLiveWriter/LamiaintervistaalTechEdlive_1855/image_2.png" width="432" alt="" /&gt;&lt;/p&gt; &lt;p&gt;&lt;img height="180" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/raffaele/WindowsLiveWriter/LamiaintervistaalTechEdlive_1855/IMG_0893.jpg" width="240" alt="" /&gt;&amp;nbsp; &lt;a href="http://msmvps.com/blogs/raffaele/WindowsLiveWriter/MyTechEdinterviewhasgonelive_C91D/DSCF0017.jpg"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="244" alt="DSCF0017" src="http://msmvps.com/blogs/raffaele/WindowsLiveWriter/MyTechEdinterviewhasgonelive_C91D/DSCF0017_thumb.jpg" width="184" border="0" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;On Monday I discovered that the video has gone live. In the video I talk about the importance of SDL, the new approach CIA / PI that simplify the DREAD / STRIDE classic concepts, and the &lt;a href="http://blogs.msdn.com/threatmodeling/"&gt;Threat Modeling and Analisys tool&lt;/a&gt; by &lt;a href="http://blogs.msdn.com/ace_team/"&gt;ACE team&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;The video Url is the following:&lt;br /&gt;&lt;a title="http://www.virtualteched.com/pages/videossearch.aspx?KW=Raffaele" href="http://www.virtualteched.com/pages/videossearch.aspx?KW=Raffaele"&gt;http://www.virtualteched.com/pages/videossearch.aspx?KW=Raffaele&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1512251" width="1" height="1"&gt;</content><author><name>raffaele</name><uri>http://msmvps.com/members/raffaele/default.aspx</uri></author></entry><entry><title>Standard damages</title><link rel="alternate" type="text/html" href="/blogs/raffaele/archive/2008/01/15/standard-damages.aspx" /><id>/blogs/raffaele/archive/2008/01/15/standard-damages.aspx</id><published>2008-01-15T09:29:22Z</published><updated>2008-01-15T09:29:22Z</updated><content type="html">&lt;p&gt;I am evaluating a new device that has its own internal webserver. It&amp;#39;s a box that deals with some input signals that can be used via TCP/IP. It sounds great since it provides also WiFi port and is security enabled. All great standard way to communicate with a device, but (there is always a but &lt;img alt="smile_regular" src="http://spaces.live.com/rte/emoticons/smile_regular.gif" /&gt;) ... &lt;/p&gt; &lt;ul&gt; &lt;li&gt;Security is provided by encrypting the password with MD5. Sadly MD5 is completely defeated and should be used only for compatibility reasons. It&amp;#39;s very easy to crack MD5 in minutes by using MD5 Rainbow Tables. Simply MD5 should never be used for new things.&lt;/li&gt; &lt;li&gt;WiFi option is provided by using WEP encryption. Oh yes, the most standard thing about WEP is the crack!!! Its algorithm is completely compromised. By using reply-attacks anyone can crack a Wep in few minutes ... you can do it also in seconds under certain conditions.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;I had the chance to show Rainbow Tables techniques, WiFi and Pre-shared key WPA, and many other cracks during last october &lt;a href="http://blogs.ugidotnet.org/raffaele/archive/2007/10/30/89295.aspx"&gt;WPC conference in Milano&lt;/a&gt;. Showing hacking techniques it&amp;#39;s a good way to warn developers and adminstrators about the risks they assume.&lt;/p&gt; &lt;p&gt;Standards are a good thing but, even when they are proved to do the bad thing, you&amp;#39;ll have to keep them around for a long time. So we should all hope that standards don&amp;#39;t grow under the trees.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1464074" width="1" height="1"&gt;</content><author><name>raffaele</name><uri>http://msmvps.com/members/raffaele/default.aspx</uri></author></entry><entry><title>RafCollection is on Codeplex</title><link rel="alternate" type="text/html" href="/blogs/raffaele/archive/2006/11/29/rafcollection-is-on-codeplex.aspx" /><id>/blogs/raffaele/archive/2006/11/29/rafcollection-is-on-codeplex.aspx</id><published>2006-11-29T08:14:00Z</published><updated>2006-11-29T08:14:00Z</updated><content type="html">&lt;P&gt;I just finished &lt;A class="" href="http://www.codeplex.com/RafCollection" target=_blank&gt;uploading on Codeplex&amp;nbsp;my RafCollection project&lt;/A&gt; that focus on a collection for building object models, support binding, etc.&lt;/P&gt;
&lt;P&gt;You may think that's too much for a collection class but the project is larger from what you may initially think. The main class is 2243 source rows and with the other classes the total is 3387 source rows.&lt;/P&gt;
&lt;P&gt;Why all this stuff? Because I needed to have a super-powerful collection in order to keep my entities as simple as possible. So the collection takes care about full binding support, sorting, filtering, finding, building views, transactional support (AcceptChanges, RejectChanges, ..) and obviously state handling.&lt;BR&gt;Well, to test the collection I needed few other things that are included in the project workspace. I am talking about an idea to load entities from the database and dealing with DBNulls, and obviously a small UI test project.&lt;/P&gt;
&lt;P&gt;You may find on the projecy home page a long document that explain how it works and the reasons for all the choices I did in building this collection.&lt;/P&gt;
&lt;P&gt;I was forgetting ... sorry for my English, I hope the mistakes in the doc (and here in my new English blog) are greater than the bugs in the project &lt;img src="http://msmvps.com/emoticons/emotion-1.gif" alt="Smile" /&gt;&lt;/P&gt;
&lt;P&gt;Enjoy! ... and report bugs please &lt;img src="http://msmvps.com/emoticons/emotion-5.gif" alt="Wink" /&gt;&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=351719" width="1" height="1"&gt;</content><author><name>raffaele</name><uri>http://msmvps.com/members/raffaele/default.aspx</uri></author><category term="RafCollection" scheme="http://msmvps.com/blogs/raffaele/archive/tags/RafCollection/default.aspx" /></entry><entry><title>My new english blog</title><link rel="alternate" type="text/html" href="/blogs/raffaele/archive/2006/11/29/my-new-english-blog.aspx" /><id>/blogs/raffaele/archive/2006/11/29/my-new-english-blog.aspx</id><published>2006-11-29T08:05:00Z</published><updated>2006-11-29T08:05:00Z</updated><content type="html">&lt;P&gt;Hi all, my name is Raffaele Rialdi, a Microsoft developer security MVP, and for the most curious people, my MVP profile is &lt;A class="" href="https://mvp.support.microsoft.com/profile=1A0D4B3B-DD09-4EAF-8535-13298702C524" target=_blank&gt;here&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;It's a long time (since June 2003)&lt;A class="" href="http://blogs.ugidotnet.org/raffaele" target=_blank&gt; I blog, but mainly only into Italian language&lt;/A&gt; but I decided to open a new English blog into this wonderful site (thanks &lt;A class="" href="http://msmvps.com/blogs/bradley" target=_blank&gt;Susan&lt;/A&gt;!).&lt;/P&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=351578" width="1" height="1"&gt;</content><author><name>raffaele</name><uri>http://msmvps.com/members/raffaele/default.aspx</uri></author></entry></feed>