<?xml version="1.0" encoding="iso-8859-1"?><!-- generator="b2evolution/3.3.1" -->
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:admin="http://webns.net/mvcb/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>Chroniques d'Am&#233;thyste</title>
		<link>http://www.dotnetguru2.org/amethyste/index.php</link>
		<atom:link rel="self" type="application/rss+xml" href="http://www.dotnetguru2.org/amethyste/index.php?tempskin=_rss2" />
		<description>Un blog en fran&#231;ais pour partager des connaissances.</description>
		<language>fr-FR</language>
		<docs>http://blogs.law.harvard.edu/tech/rss</docs>
		<admin:generatorAgent rdf:resource="http://b2evolution.net/?v=3.3.1"/>
		<ttl>60</ttl>
				<item>
			<title>Pourquoi TRON s&#8217;appelle TRON ?</title>
			<link>http://www.dotnetguru2.org/amethyste/index.php/2011/02/21/pourquoi-tron-s-appelle-tron</link>
			<pubDate>Mon, 21 Feb 2011 22:08:05 +0000</pubDate>			<dc:creator>amethyste</dc:creator>
			<category domain="main">focus</category>			<guid isPermaLink="false">1315@http://www.dotnetguru2.org/</guid>
						<description>&lt;p&gt;R&amp;#233;cemment Walt Disney nous a gratifi&amp;#233; d&amp;#8217;une de ses productions : Tron l&amp;#8217;h&amp;#233;ritage&lt;br /&gt;Il se trouve que je suis assez ancien pour avoir vu au cin&amp;#233;ma Tron en 1982 et tous ceux qui sont assez anciens pour avoir vu le film original de 1982 savent ce que veut dire TRON.&lt;br /&gt;Du moins ceux qui faisaient d&amp;#233;j&amp;#224; de l&amp;#8217;informatique&amp;#8230;&lt;br /&gt;&lt;br /&gt;A l&amp;#8217;&amp;#233;poque l&amp;#8217;informatique individuelle ne ressemblait &amp;#224; rien &amp;#224; ce que l&amp;#8217;on voit aujourd&amp;#8217;hui : &lt;br /&gt;&lt;br /&gt;&amp;#8226;&amp;#160;&amp;#160;&amp;#160; pas d&amp;#8217;&amp;#233;crans plats, &lt;br /&gt;&amp;#8226;&amp;#160;&amp;#160;&amp;#160; pas de souris, &lt;br /&gt;&amp;#8226;&amp;#160;&amp;#160;&amp;#160; pas d&amp;#8217;&amp;#233;crans graphiques ou couleurs, &lt;br /&gt;&amp;#8226;&amp;#160;&amp;#160;&amp;#160; pas de disque dur, disquettes ou clef Usb (on enregistrait sur des K7, oui vous avez bien lu)&lt;br /&gt;&amp;#8226;&amp;#160;&amp;#160;&amp;#160; Pas de syst&amp;#232;me d&amp;#8217;exploitation&lt;br /&gt;&amp;#8226;&amp;#160;&amp;#160;&amp;#160; Certaines machines &amp;#233;taient livr&amp;#233;es en pi&amp;#232;ce d&amp;#233;tach&amp;#233;es &amp;#224; souder soi-m&amp;#234;me (qui se souvient du Kim ou du ZX 81 ???)&lt;br /&gt;&amp;#8226;&amp;#160;&amp;#160;&amp;#160; Pas d&amp;#8217;Internet (non je n&amp;#8217;ai pas fum&amp;#233;)&lt;br /&gt;&amp;#8226;&amp;#160;&amp;#160;&amp;#160; Pas de modem (je n&amp;#8217;ai pas non plus bu)&lt;br /&gt;&amp;#8226;&amp;#160;&amp;#160;&amp;#160; Des machines &amp;#224; ultra haute teneur en incompatibilit&amp;#233; (laissez tomber, je sais bien que vous ne comprenez m&amp;#234;me pas le mot)&lt;br /&gt;&lt;br /&gt;Et puis surtout pas de langage de programmation &amp;#224; part l&amp;#8217;assembleur !!!!!&lt;br /&gt;&lt;br /&gt;Bon j&amp;#8217;exag&amp;#232;re un peu, en fait &amp;#224; cette &amp;#233;poque un certains Bill Gates et son comp&amp;#232;re Paul Allen avaient une sp&amp;#233;cialit&amp;#233; : d&amp;#232;s qu&amp;#8217;un microprocesseur sortait quelque part, Allen &amp;#233;crivait un &amp;#233;mulateur sur le PDP 11 de la fac et Bill s&amp;#8217;en servait pour &amp;#233;crire un compilateur BASIC adapt&amp;#233; qu&amp;#8217;ils s&amp;#8217;empressaient de revendre aux fabricants utilisant ce microprocesseur. Parfois m&amp;#234;me dans l&amp;#8217;avion qui les amenaient de leur Californie natale&lt;br /&gt;vers l&amp;#8217;usine de leur futur client !&lt;br /&gt;Et c&amp;#8217;&amp;#233;tait d&amp;#8217;autant plus payant que leur impl&amp;#233;mentation de BASIC a &amp;#233;t&amp;#233; la premi&amp;#232;re dot&amp;#233;e de capacit&amp;#233; graphique.&lt;br /&gt;&lt;br /&gt;Eh oui, je me souviens encore avoir lu dans les revues de programmation de l&amp;#8217;&amp;#233;poque des articles sign&amp;#233;s Bill Gates expliquant un des nombreux hack en assembleur qu&amp;#8217;il aimait inventer pour &amp;#233;conomiser de la m&amp;#233;moire.&lt;br /&gt;Parce que voyez-vous &amp;#224; l&amp;#8217;&amp;#233;poque un d&amp;#233;veloppeur devait savoir calculer la place m&amp;#233;moire utilis&amp;#233;e par un programme &amp;#224; l&amp;#8217;octet pr&amp;#232;s &amp;#224; partir de son source histoire d&amp;#8217;&amp;#234;tre certain qu&amp;#8217;il s&amp;#8217;ex&amp;#233;cute jusque au bout !&lt;br /&gt;&lt;br /&gt;Une &amp;#233;poque de dingue ?&lt;br /&gt;Le terme technique est plut&amp;#244;t &amp;#171; le bon vieux temps &amp;#187;.&lt;br /&gt;&lt;br /&gt;Alors revenons &amp;#224; TRON. C&amp;#8217;est quoi cette b&amp;#234;te-l&amp;#224; ?&lt;br /&gt;&lt;br /&gt;En l&amp;#8217;absence d&amp;#8217;IDE et de notion de point d&amp;#8217;arr&amp;#234;t et autres gadgets, la seule fa&amp;#231;on de tester un code &amp;#233;tait de l&amp;#8217;ex&amp;#233;cuter et regarder ce qu&amp;#8217;il affichait.&lt;br /&gt;Alors BASIC a invent&amp;#233; une commande appel&amp;#233;e TRON qui est l&amp;#8217;abr&amp;#233;viation de TRACE ON.&lt;br /&gt;D&amp;#232;s que TRON &amp;#233;tait invoqu&amp;#233;, l&amp;#8217;interpr&amp;#233;teur BASIC affichait &amp;#224; l&amp;#8217;&amp;#233;cran le code de la ligne en cours d&amp;#8217;ex&amp;#233;cution jusqu&amp;#8217;&amp;#224; ce qu&amp;#8217;il rencontre un TROFF. Cela permettait de savoir o&amp;#249; en &amp;#233;tait le programme.&lt;br /&gt;&lt;br /&gt;C&amp;#8217;est de l&amp;#224; que vient le nom du film, encore que cette interpr&amp;#233;tation soi contest&amp;#233;e dans Wikipedia.&lt;br /&gt;&lt;br /&gt;TRON &amp;#233;tait un exploit technologique &amp;#224; l&amp;#8217;&amp;#233;poque car il s&amp;#8217;agissait du premier film &amp;#224; utiliser des effets sp&amp;#233;ciaux num&amp;#233;riques de fa&amp;#231;on intensive. Jurassique Park &amp;#233;tait encore loin.&lt;br /&gt;&lt;br /&gt;Voil&amp;#224; un article typique des 22 f&amp;#233;vrier, jour de mon anniversaire !&lt;/p&gt;&lt;div class=&quot;item_footer&quot;&gt;&lt;p&gt;&lt;small&gt;&lt;a href=&quot;http://www.dotnetguru2.org/amethyste/index.php/2011/02/21/pourquoi-tron-s-appelle-tron&quot;&gt;Original post&lt;/a&gt; blogged on &lt;a href=&quot;http://b2evolution.net/&quot;&gt;b2evolution&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;&lt;/div&gt;</description>
			<content:encoded><![CDATA[<p>R&#233;cemment Walt Disney nous a gratifi&#233; d&#8217;une de ses productions : Tron l&#8217;h&#233;ritage<br />Il se trouve que je suis assez ancien pour avoir vu au cin&#233;ma Tron en 1982 et tous ceux qui sont assez anciens pour avoir vu le film original de 1982 savent ce que veut dire TRON.<br />Du moins ceux qui faisaient d&#233;j&#224; de l&#8217;informatique&#8230;<br /><br />A l&#8217;&#233;poque l&#8217;informatique individuelle ne ressemblait &#224; rien &#224; ce que l&#8217;on voit aujourd&#8217;hui : <br /><br />&#8226;&#160;&#160;&#160; pas d&#8217;&#233;crans plats, <br />&#8226;&#160;&#160;&#160; pas de souris, <br />&#8226;&#160;&#160;&#160; pas d&#8217;&#233;crans graphiques ou couleurs, <br />&#8226;&#160;&#160;&#160; pas de disque dur, disquettes ou clef Usb (on enregistrait sur des K7, oui vous avez bien lu)<br />&#8226;&#160;&#160;&#160; Pas de syst&#232;me d&#8217;exploitation<br />&#8226;&#160;&#160;&#160; Certaines machines &#233;taient livr&#233;es en pi&#232;ce d&#233;tach&#233;es &#224; souder soi-m&#234;me (qui se souvient du Kim ou du ZX 81 ???)<br />&#8226;&#160;&#160;&#160; Pas d&#8217;Internet (non je n&#8217;ai pas fum&#233;)<br />&#8226;&#160;&#160;&#160; Pas de modem (je n&#8217;ai pas non plus bu)<br />&#8226;&#160;&#160;&#160; Des machines &#224; ultra haute teneur en incompatibilit&#233; (laissez tomber, je sais bien que vous ne comprenez m&#234;me pas le mot)<br /><br />Et puis surtout pas de langage de programmation &#224; part l&#8217;assembleur !!!!!<br /><br />Bon j&#8217;exag&#232;re un peu, en fait &#224; cette &#233;poque un certains Bill Gates et son comp&#232;re Paul Allen avaient une sp&#233;cialit&#233; : d&#232;s qu&#8217;un microprocesseur sortait quelque part, Allen &#233;crivait un &#233;mulateur sur le PDP 11 de la fac et Bill s&#8217;en servait pour &#233;crire un compilateur BASIC adapt&#233; qu&#8217;ils s&#8217;empressaient de revendre aux fabricants utilisant ce microprocesseur. Parfois m&#234;me dans l&#8217;avion qui les amenaient de leur Californie natale<br />vers l&#8217;usine de leur futur client !<br />Et c&#8217;&#233;tait d&#8217;autant plus payant que leur impl&#233;mentation de BASIC a &#233;t&#233; la premi&#232;re dot&#233;e de capacit&#233; graphique.<br /><br />Eh oui, je me souviens encore avoir lu dans les revues de programmation de l&#8217;&#233;poque des articles sign&#233;s Bill Gates expliquant un des nombreux hack en assembleur qu&#8217;il aimait inventer pour &#233;conomiser de la m&#233;moire.<br />Parce que voyez-vous &#224; l&#8217;&#233;poque un d&#233;veloppeur devait savoir calculer la place m&#233;moire utilis&#233;e par un programme &#224; l&#8217;octet pr&#232;s &#224; partir de son source histoire d&#8217;&#234;tre certain qu&#8217;il s&#8217;ex&#233;cute jusque au bout !<br /><br />Une &#233;poque de dingue ?<br />Le terme technique est plut&#244;t &#171; le bon vieux temps &#187;.<br /><br />Alors revenons &#224; TRON. C&#8217;est quoi cette b&#234;te-l&#224; ?<br /><br />En l&#8217;absence d&#8217;IDE et de notion de point d&#8217;arr&#234;t et autres gadgets, la seule fa&#231;on de tester un code &#233;tait de l&#8217;ex&#233;cuter et regarder ce qu&#8217;il affichait.<br />Alors BASIC a invent&#233; une commande appel&#233;e TRON qui est l&#8217;abr&#233;viation de TRACE ON.<br />D&#232;s que TRON &#233;tait invoqu&#233;, l&#8217;interpr&#233;teur BASIC affichait &#224; l&#8217;&#233;cran le code de la ligne en cours d&#8217;ex&#233;cution jusqu&#8217;&#224; ce qu&#8217;il rencontre un TROFF. Cela permettait de savoir o&#249; en &#233;tait le programme.<br /><br />C&#8217;est de l&#224; que vient le nom du film, encore que cette interpr&#233;tation soi contest&#233;e dans Wikipedia.<br /><br />TRON &#233;tait un exploit technologique &#224; l&#8217;&#233;poque car il s&#8217;agissait du premier film &#224; utiliser des effets sp&#233;ciaux num&#233;riques de fa&#231;on intensive. Jurassique Park &#233;tait encore loin.<br /><br />Voil&#224; un article typique des 22 f&#233;vrier, jour de mon anniversaire !</p><div class="item_footer"><p><small><a href="http://www.dotnetguru2.org/amethyste/index.php/2011/02/21/pourquoi-tron-s-appelle-tron">Original post</a> blogged on <a href="http://b2evolution.net/">b2evolution</a>.</small></p></div>]]></content:encoded>
								<comments>http://www.dotnetguru2.org/amethyste/index.php/2011/02/21/pourquoi-tron-s-appelle-tron#comments</comments>
			<wfw:commentRss>http://www.dotnetguru2.org/amethyste/index.php?tempskin=_rss2&#38;disp=comments&#38;p=1315</wfw:commentRss>
		</item>
				<item>
			<title>Les Httphandler, IHttpModule et autres fichiers ASHX</title>
			<link>http://www.dotnetguru2.org/amethyste/index.php/2010/05/29/les-httphandler-ihttpmodule-et-autres-fichiers-ashx</link>
			<pubDate>Sat, 29 May 2010 21:55:04 +0000</pubDate>			<dc:creator>amethyste</dc:creator>
			<category domain="main">focus</category>			<guid isPermaLink="false">1234@http://www.dotnetguru2.org/</guid>
						<description>&lt;p class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 0pt;&quot;&gt;&lt;span style=&quot;mso-fareast-font-family: 'Times New Roman'; mso-fareast-theme-font: minor-fareast; mso-fareast-language: FR; mso-no-proof: yes;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&lt;span style=&quot;font-family: Calibri;&quot;&gt;Mon premier article portait sur l&amp;#8217;&amp;#233;criture de IHttpmodule.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 0pt;&quot;&gt;&lt;span style=&quot;mso-fareast-font-family: 'Times New Roman'; mso-fareast-theme-font: minor-fareast; mso-fareast-language: FR; mso-no-proof: yes;&quot;&gt;&lt;span style=&quot;font-family: Calibri; font-size: small;&quot;&gt;&amp;#160;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 0pt;&quot;&gt;&lt;a href=&quot;http://www.dotnetguru.org/articles/dossiers/etendreASPnet/EtendreASPNET.htm&quot;&gt;&lt;span style=&quot;font-family: Calibri; color: #800080; font-size: small;&quot;&gt;&lt;a href=&quot;http://www.dotnetguru.org/articles/dossiers/etendreASPnet/EtendreASPNET.htm&quot;&gt;http://www.dotnetguru.org/articles/dossiers/etendreASPnet/EtendreASPNET.htm&lt;/a&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 0pt;&quot;&gt;&lt;span style=&quot;font-family: Calibri; font-size: small;&quot;&gt;&amp;#160;&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 0pt;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&lt;span style=&quot;font-family: Calibri;&quot;&gt;Il s&amp;#8217;agit l&amp;#224; d&amp;#8217;un outil int&amp;#233;ressant &amp;#224; avoir dans votre palette, je m&amp;#8217;en sers assez souvent, par exemple pour &amp;#233;crire des modules SEO.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 0pt;&quot;&gt;&lt;span style=&quot;font-family: Calibri; font-size: small;&quot;&gt;&amp;#160;&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 0pt;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&lt;span style=&quot;font-family: Calibri;&quot;&gt;J&amp;#8217;avais &amp;#233;voqu&amp;#233; la cr&amp;#233;ation de ASHX. A l&amp;#8217;&amp;#233;poque leur &amp;#233;criture &amp;#233;tait p&amp;#233;nible (pas d&amp;#8217;Intellisense, doc &amp;#233;vanescente et aucune possibilit&amp;#233; s&amp;#233;rieuse de d&amp;#233;bogage). Depuis j&amp;#8217;ai toujours en t&amp;#234;te de compl&amp;#233;ter cet article avec les am&amp;#233;liorations que Microsoft a apport&amp;#233;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 0pt;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&lt;span style=&quot;font-family: Calibri;&quot;&gt;Alors le voici.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 0pt;&quot;&gt;&lt;span style=&quot;font-family: Calibri; font-size: small;&quot;&gt;&amp;#160;&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 0pt;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&lt;span style=&quot;font-family: Calibri;&quot;&gt;Les d&amp;#233;fauts d&amp;#8217;ergonomie des ASHX ont &amp;#233;t&amp;#233; corrig&amp;#233;s depuis VS 2005. Donc plut&amp;#244;t que de cr&amp;#233;er une page ASPX pour g&amp;#233;rer des infos ou des dialogues purement techniques avec votre site, pensez ASHX. Pensez aussi ASHX pour g&amp;#233;rer des fonctionnalit&amp;#233;s comme les download. C&amp;#8217;est vraiment tr&amp;#232;s simple et efficace.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 0pt;&quot;&gt;&lt;span style=&quot;font-family: Calibri; font-size: small;&quot;&gt;&amp;#160;&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 0pt;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&lt;span style=&quot;font-family: Calibri;&quot;&gt;Depuis ASP.NET 4.0, on dispose &amp;#233;galement d&amp;#8217;une petite am&amp;#233;lioration concernant les handler http.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 0pt;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&lt;span style=&quot;font-family: Calibri;&quot;&gt;Pour activer les &amp;#233;tats de session, il fallait d&amp;#233;corer la classe avec l&amp;#8217;interface &lt;strong style=&quot;mso-bidi-font-weight: normal;&quot;&gt;IRequiresSessionState&lt;/strong&gt;. Une bien curieuse fa&amp;#231;on de faire je trouve.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 0pt;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&lt;span style=&quot;font-family: Calibri;&quot;&gt;Les choses se sont am&amp;#233;lior&amp;#233;es avec la m&amp;#233;thode &lt;strong style=&quot;mso-bidi-font-weight: normal;&quot;&gt;HttpContexte.Current.SetSessionStateBehavior&lt;/strong&gt;().&lt;br /&gt;Rappelons que votre page Web est un handler http.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 0pt;&quot;&gt;&lt;span style=&quot;font-family: Calibri; font-size: small;&quot;&gt;&amp;#160;&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 0pt;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&lt;span style=&quot;font-family: Calibri;&quot;&gt;Voil&amp;#224;, blog pas bien long, mais je pense utile.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;item_footer&quot;&gt;&lt;p&gt;&lt;small&gt;&lt;a href=&quot;http://www.dotnetguru2.org/amethyste/index.php/2010/05/29/les-httphandler-ihttpmodule-et-autres-fichiers-ashx&quot;&gt;Original post&lt;/a&gt; blogged on &lt;a href=&quot;http://b2evolution.net/&quot;&gt;b2evolution&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;&lt;/div&gt;</description>
			<content:encoded><![CDATA[<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="mso-fareast-font-family: 'Times New Roman'; mso-fareast-theme-font: minor-fareast; mso-fareast-language: FR; mso-no-proof: yes;"><span style="font-size: small;"><span style="font-family: Calibri;">Mon premier article portait sur l&#8217;&#233;criture de IHttpmodule.</span></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="mso-fareast-font-family: 'Times New Roman'; mso-fareast-theme-font: minor-fareast; mso-fareast-language: FR; mso-no-proof: yes;"><span style="font-family: Calibri; font-size: small;">&#160;</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><a href="http://www.dotnetguru.org/articles/dossiers/etendreASPnet/EtendreASPNET.htm"><span style="font-family: Calibri; color: #800080; font-size: small;"><a href="http://www.dotnetguru.org/articles/dossiers/etendreASPnet/EtendreASPNET.htm">http://www.dotnetguru.org/articles/dossiers/etendreASPnet/EtendreASPNET.htm</a></span></a></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-family: Calibri; font-size: small;">&#160;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span style="font-family: Calibri;">Il s&#8217;agit l&#224; d&#8217;un outil int&#233;ressant &#224; avoir dans votre palette, je m&#8217;en sers assez souvent, par exemple pour &#233;crire des modules SEO.</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-family: Calibri; font-size: small;">&#160;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span style="font-family: Calibri;">J&#8217;avais &#233;voqu&#233; la cr&#233;ation de ASHX. A l&#8217;&#233;poque leur &#233;criture &#233;tait p&#233;nible (pas d&#8217;Intellisense, doc &#233;vanescente et aucune possibilit&#233; s&#233;rieuse de d&#233;bogage). Depuis j&#8217;ai toujours en t&#234;te de compl&#233;ter cet article avec les am&#233;liorations que Microsoft a apport&#233;.</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span style="font-family: Calibri;">Alors le voici.</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-family: Calibri; font-size: small;">&#160;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span style="font-family: Calibri;">Les d&#233;fauts d&#8217;ergonomie des ASHX ont &#233;t&#233; corrig&#233;s depuis VS 2005. Donc plut&#244;t que de cr&#233;er une page ASPX pour g&#233;rer des infos ou des dialogues purement techniques avec votre site, pensez ASHX. Pensez aussi ASHX pour g&#233;rer des fonctionnalit&#233;s comme les download. C&#8217;est vraiment tr&#232;s simple et efficace.</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-family: Calibri; font-size: small;">&#160;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span style="font-family: Calibri;">Depuis ASP.NET 4.0, on dispose &#233;galement d&#8217;une petite am&#233;lioration concernant les handler http.</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span style="font-family: Calibri;">Pour activer les &#233;tats de session, il fallait d&#233;corer la classe avec l&#8217;interface <strong style="mso-bidi-font-weight: normal;">IRequiresSessionState</strong>. Une bien curieuse fa&#231;on de faire je trouve.</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span style="font-family: Calibri;">Les choses se sont am&#233;lior&#233;es avec la m&#233;thode <strong style="mso-bidi-font-weight: normal;">HttpContexte.Current.SetSessionStateBehavior</strong>().<br />Rappelons que votre page Web est un handler http.</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-family: Calibri; font-size: small;">&#160;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span style="font-family: Calibri;">Voil&#224;, blog pas bien long, mais je pense utile.</span></span></p><div class="item_footer"><p><small><a href="http://www.dotnetguru2.org/amethyste/index.php/2010/05/29/les-httphandler-ihttpmodule-et-autres-fichiers-ashx">Original post</a> blogged on <a href="http://b2evolution.net/">b2evolution</a>.</small></p></div>]]></content:encoded>
								<comments>http://www.dotnetguru2.org/amethyste/index.php/2010/05/29/les-httphandler-ihttpmodule-et-autres-fichiers-ashx#comments</comments>
			<wfw:commentRss>http://www.dotnetguru2.org/amethyste/index.php?tempskin=_rss2&#38;disp=comments&#38;p=1234</wfw:commentRss>
		</item>
				<item>
			<title>Cr&#233;er un fichier en ASCII avec Visual Studio</title>
			<link>http://www.dotnetguru2.org/amethyste/index.php/2010/05/23/creer-un-fichier-en-ascii-avec-visual-studio</link>
			<pubDate>Sun, 23 May 2010 21:08:03 +0000</pubDate>			<dc:creator>amethyste</dc:creator>
			<category domain="main">focus</category>			<guid isPermaLink="false">1232@http://www.dotnetguru2.org/</guid>
						<description>&lt;p&gt;Mon projet actuel utilise un service Windows. Pour me simplifier la vie j'ai cr&amp;#233;&amp;#233; un petit fichier .bat afin d'installer et lancer le service.&lt;/p&gt;
&lt;p&gt;Ceux d'entre vous qui ont cr&amp;#233;&amp;#233; le fichier depuis Visual Studio ont remarqu&amp;#233; que le fichier a un comportement bizarre une fois lanc&amp;#233; depuis la ligne de commande.&lt;/p&gt;
&lt;p&gt;Un message d'erreur autour d'un myst&amp;#233;rieux caract&amp;#232;re: &amp;#8745;&amp;#9559;&amp;#9488; appara&amp;#238;t.&lt;/p&gt;
&lt;p&gt;La raison en est que par d&amp;#233;faut Visual Studio cr&amp;#233;&amp;#233; des fichier en UTF-8 et place en d&amp;#233;but de fichier un caract&amp;#232;re appel&amp;#233; &quot;marque d'ordre des octets&quot; par les experts de l'encodage.&lt;/p&gt;
&lt;p&gt;Allez voir sur Wikipedia ce dont il s'agit:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://fr.wikipedia.org/wiki/Marque_d%27ordre_des_octets&quot;&gt;&lt;a href=&quot;http://fr.wikipedia.org/wiki/Marque_d%27ordre_des_octets&quot;&gt;http://fr.wikipedia.org/wiki/Marque_d%27ordre_des_octets&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Jusqu'&amp;#224; pr&amp;#233;sent je pr&amp;#233;f&amp;#233;rai cr&amp;#233;er mon fichier depuis Notepad++ et l'inclure dans la solution. Mais au d&amp;#233;tour d'un forum j'ai appris que VS est capable de cr&amp;#233;er des fichiers dans d'autres formats et c'est tr&amp;#232;s simple.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Cr&amp;#233;ez votre fichier texte comme auparavant&lt;/li&gt;
&lt;li&gt;ouvrez le&lt;/li&gt;
&lt;li&gt;allez dans le menu File/Save as...&lt;/li&gt;
&lt;li&gt;Remarquez que le bouton Enregistrer &amp;#224; une petite fl&amp;#232;che sur sa droite, cliquez dessus&lt;/li&gt;
&lt;li&gt;Une fen&amp;#234;tre &quot;Advanced Save Option&quot; s'ouvre. Choisisssez l'encodage US-ASCII&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Et voil&amp;#224; l'affaire est r&amp;#233;gl&amp;#233;e.&lt;/p&gt;
&lt;p&gt;Le forum est ici:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://stackoverflow.com/questions/854360/visual-studio-inserts-invalid-characters-in-batch-files&quot;&gt;&lt;a href=&quot;http://stackoverflow.com/questions/854360/visual-studio-inserts-invalid-characters-in-batch-files&quot;&gt;http://stackoverflow.com/questions/854360/visual-studio-inserts-invalid-characters-in-batch-files&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;p&gt;PS: ceux qui commentent ce blog ont du remarquer que votre post met du temps pour appara&amp;#238;tre. Plusieurs semaines.&lt;/p&gt;
&lt;p&gt;C'est parce que je suis suppos&amp;#233; valider avant la publication et que je ne le fais pas r&amp;#233;guli&amp;#232;rement!!!!&lt;/p&gt;
&lt;p&gt;Je m'en excuse d'avance.&lt;/p&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;div class=&quot;item_footer&quot;&gt;&lt;p&gt;&lt;small&gt;&lt;a href=&quot;http://www.dotnetguru2.org/amethyste/index.php/2010/05/23/creer-un-fichier-en-ascii-avec-visual-studio&quot;&gt;Original post&lt;/a&gt; blogged on &lt;a href=&quot;http://b2evolution.net/&quot;&gt;b2evolution&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;&lt;/div&gt;</description>
			<content:encoded><![CDATA[<p>Mon projet actuel utilise un service Windows. Pour me simplifier la vie j'ai cr&#233;&#233; un petit fichier .bat afin d'installer et lancer le service.</p>
<p>Ceux d'entre vous qui ont cr&#233;&#233; le fichier depuis Visual Studio ont remarqu&#233; que le fichier a un comportement bizarre une fois lanc&#233; depuis la ligne de commande.</p>
<p>Un message d'erreur autour d'un myst&#233;rieux caract&#232;re: &#8745;&#9559;&#9488; appara&#238;t.</p>
<p>La raison en est que par d&#233;faut Visual Studio cr&#233;&#233; des fichier en UTF-8 et place en d&#233;but de fichier un caract&#232;re appel&#233; "marque d'ordre des octets" par les experts de l'encodage.</p>
<p>Allez voir sur Wikipedia ce dont il s'agit:</p>
<p><a href="http://fr.wikipedia.org/wiki/Marque_d%27ordre_des_octets"><a href="http://fr.wikipedia.org/wiki/Marque_d%27ordre_des_octets">http://fr.wikipedia.org/wiki/Marque_d%27ordre_des_octets</a></a></p>
<p>Jusqu'&#224; pr&#233;sent je pr&#233;f&#233;rai cr&#233;er mon fichier depuis Notepad++ et l'inclure dans la solution. Mais au d&#233;tour d'un forum j'ai appris que VS est capable de cr&#233;er des fichiers dans d'autres formats et c'est tr&#232;s simple.</p>
<ol>
<li>Cr&#233;ez votre fichier texte comme auparavant</li>
<li>ouvrez le</li>
<li>allez dans le menu File/Save as...</li>
<li>Remarquez que le bouton Enregistrer &#224; une petite fl&#232;che sur sa droite, cliquez dessus</li>
<li>Une fen&#234;tre "Advanced Save Option" s'ouvre. Choisisssez l'encodage US-ASCII</li>
</ol>
<p>Et voil&#224; l'affaire est r&#233;gl&#233;e.</p>
<p>Le forum est ici:</p>
<p><a href="http://stackoverflow.com/questions/854360/visual-studio-inserts-invalid-characters-in-batch-files"><a href="http://stackoverflow.com/questions/854360/visual-studio-inserts-invalid-characters-in-batch-files">http://stackoverflow.com/questions/854360/visual-studio-inserts-invalid-characters-in-batch-files</a></a></p>
<p>&#160;</p>
<p>PS: ceux qui commentent ce blog ont du remarquer que votre post met du temps pour appara&#238;tre. Plusieurs semaines.</p>
<p>C'est parce que je suis suppos&#233; valider avant la publication et que je ne le fais pas r&#233;guli&#232;rement!!!!</p>
<p>Je m'en excuse d'avance.</p>
<p>&#160;</p><div class="item_footer"><p><small><a href="http://www.dotnetguru2.org/amethyste/index.php/2010/05/23/creer-un-fichier-en-ascii-avec-visual-studio">Original post</a> blogged on <a href="http://b2evolution.net/">b2evolution</a>.</small></p></div>]]></content:encoded>
								<comments>http://www.dotnetguru2.org/amethyste/index.php/2010/05/23/creer-un-fichier-en-ascii-avec-visual-studio#comments</comments>
			<wfw:commentRss>http://www.dotnetguru2.org/amethyste/index.php?tempskin=_rss2&#38;disp=comments&#38;p=1232</wfw:commentRss>
		</item>
				<item>
			<title>pourquoi il faut plus de temps pour rejeter un mot de passe invalide que pour en accepter un correct</title>
			<link>http://www.dotnetguru2.org/amethyste/index.php/2010/04/02/pourquoi-il-faut-plus-de-temps-pour-rejeter-un-mot-de-passe-invalide-que-pour-en-accepter-un-correct</link>
			<pubDate>Fri, 02 Apr 2010 21:58:10 +0000</pubDate>			<dc:creator>amethyste</dc:creator>
			<category domain="main">focus</category>			<guid isPermaLink="false">1213@http://www.dotnetguru2.org/</guid>
						<description>&lt;p&gt;C&amp;#8217;est vrai que personne ne m&amp;#8217;a pos&amp;#233; la question, mais c&amp;#8217;est certainement de la timidit&amp;#233;, vous &amp;#234;tes s&amp;#251;rement nombreux &amp;#224; vous demander pourquoi il faut plus de temps pour rejeter un mot de passe invalide que pour en accepter un correct ?&lt;/p&gt;
&lt;p&gt;Je c&amp;#232;de donc au chantage de la foule et y r&amp;#233;ponds !&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;J&amp;#8217;y r&amp;#233;ponds, vite dit, je reproduits juste la r&amp;#233;ponse publi&amp;#233;e par Raymond Chen sur son blog que j&amp;#8217;adore: The Old New Thing [1].&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;La r&amp;#233;ponse courte est que valider qu&amp;#8217;un mot de passe est incorrect n&amp;#8217;est pas aussi simple que cela en a l&amp;#8217;air.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;Lorsque vous vous loguez la premi&amp;#232;re fois, Windows place le mot de passe dans un cache sp&amp;#233;cial [2, 4] qui conserve les mots de passe des 10 derniers utilisateurs. Ainsi si vous verrouillez votre session, le d&amp;#233;verrouillage sera instantan&amp;#233; car Windows consid&amp;#232;re que si le mot de passe est plac&amp;#233; dans le cache alors il est r&amp;#233;put&amp;#233; valid&amp;#233;.&lt;br /&gt;Le cache permet m&amp;#234;me de se reconnecter si par hasard vous n&amp;#8217;aviez plus de connexion &amp;#224; ce moment l&amp;#224;.&lt;/p&gt;
&lt;p&gt;Evidement vous allez me dire que m&amp;#234;me sans &amp;#234;tre connect&amp;#233; &amp;#224; mon serveur de domaine favori, je peux tout de m&amp;#234;me me reconnecter &amp;#224; ma machine.&lt;br /&gt;Encore une fois c&amp;#8217;est le cache de mots de passe qui agit dans les coulisses.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;Je ne le savais pas, mais il est possible de le d&amp;#233;sactiver pour faire une blague d&amp;#233;sopilante &amp;#224; un coll&amp;#232;gue qui part faire un avant vente en client&amp;#232;le par exemple [3].&lt;/p&gt;
&lt;p&gt;&amp;#8230;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;D&amp;#233;connez pas les gars ! &lt;br /&gt;La vraie raison de cette possibilit&amp;#233; est simplement de garantir qu&amp;#8217;il est impossible de se connecter dans un contexte de s&amp;#233;curit&amp;#233; obsol&amp;#232;te.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;Revenons &amp;#224; notre histoire. Il y a 3 cas de figure :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Le mot de passe saisi se trouve dans le cache. Super, il est donc valide et on se connecte direct, c&amp;#8217;est rapide.&lt;/li&gt;
&lt;li&gt;Il n&amp;#8217;est pas dans le cache : il faut interroger le contr&amp;#244;leur de domaine, c&amp;#8217;est plus ou moins long.&lt;/li&gt;
&lt;li&gt;Il est dans le cache, mais la saisie est invalide. Dans ce cas on retourne imm&amp;#233;diatement KO et c&amp;#8217;est rapide&amp;#8230;&lt;br /&gt;&lt;br /&gt;Vraiment ?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;br /&gt;Et bien pas tout &amp;#224; fait. Il se pourrait parfaitement que la saisie soit en fait valide, mais que ce soit juste le hachage stock&amp;#233; dans le cache qui ne l&amp;#8217;est plus parce que votre admin ador&amp;#233; (ou vous-m&amp;#234;me) a modifi&amp;#233; le mot de passe depuis un autre machine. Il faut donc tester ce cas de figure l&amp;#224; aussi en interrogeant le contr&amp;#244;leur de domaine.&lt;br /&gt;Evidement ce n&amp;#8217;est pas gratuit.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;Il existe une autre raison plus subtile qui explique que tester un mot de passe invalide soit un peu plus long : le syst&amp;#232;me ajoute automatiquement quelques secondes d&amp;#8217;attente.&lt;br /&gt;C&amp;#8217;est bizarre vu comme cela, mais cette mesure limite le risque d&amp;#8217;attaques avec des dictionnaires de mots de passe en augmentant de fa&amp;#231;on rapidement disproportionn&amp;#233;e le temps moyen n&amp;#233;cessaire pour craquer le mot de passe.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bibliographie&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;[1] The Old New Thing&lt;br /&gt;&lt;a href=&quot;http://blogs.msdn.com/oldnewthing/archive/2010/03/23/9983312.aspx&quot;&gt;&lt;a href=&quot;http://blogs.msdn.com/oldnewthing/archive/2010/03/23/9983312.aspx&quot;&gt;http://blogs.msdn.com/oldnewthing/archive/2010/03/23/9983312.aspx&lt;/a&gt;&lt;/a&gt;&lt;br /&gt;[2] S&amp;#233;curit&amp;#233; des informations d'identification mises en cache dans Windows Server 2003, dans Windows XP et dans Windows 2000 (en fran&amp;#231;ais !!!!)&lt;br /&gt;&lt;a href=&quot;http://support.microsoft.com/kb/913485&quot;&gt;&lt;a href=&quot;http://support.microsoft.com/kb/913485&quot;&gt;http://support.microsoft.com/kb/913485&lt;/a&gt;&lt;/a&gt;&lt;br /&gt;[3] Restricting cached credentials in Windows&lt;br /&gt;&lt;a href=&quot;http://searchwinit.techtarget.com/tip/0,289483,sid1_gci968000,00.html&quot;&gt;&lt;a href=&quot;http://searchwinit.techtarget.com/tip/0,289483,sid1_gci968000,00.html&quot;&gt;http://searchwinit.techtarget.com/tip/0,289483,sid1_gci968000,00.html&lt;/a&gt;&lt;/a&gt;&lt;br /&gt;[4] Windows Confidential&lt;br /&gt;&lt;a href=&quot;http://technet.microsoft.com/en-us/magazine/2009.07.windowsconfidential.aspx&quot;&gt;&lt;a href=&quot;http://technet.microsoft.com/en-us/magazine/2009.07.windowsconfidential.aspx&quot;&gt;http://technet.microsoft.com/en-us/magazine/2009.07.windowsconfidential.aspx&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;div class=&quot;item_footer&quot;&gt;&lt;p&gt;&lt;small&gt;&lt;a href=&quot;http://www.dotnetguru2.org/amethyste/index.php/2010/04/02/pourquoi-il-faut-plus-de-temps-pour-rejeter-un-mot-de-passe-invalide-que-pour-en-accepter-un-correct&quot;&gt;Original post&lt;/a&gt; blogged on &lt;a href=&quot;http://b2evolution.net/&quot;&gt;b2evolution&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;&lt;/div&gt;</description>
			<content:encoded><![CDATA[<p>C&#8217;est vrai que personne ne m&#8217;a pos&#233; la question, mais c&#8217;est certainement de la timidit&#233;, vous &#234;tes s&#251;rement nombreux &#224; vous demander pourquoi il faut plus de temps pour rejeter un mot de passe invalide que pour en accepter un correct ?</p>
<p>Je c&#232;de donc au chantage de la foule et y r&#233;ponds !</p>
<p><br />J&#8217;y r&#233;ponds, vite dit, je reproduits juste la r&#233;ponse publi&#233;e par Raymond Chen sur son blog que j&#8217;adore: The Old New Thing [1].</p>
<p><br />La r&#233;ponse courte est que valider qu&#8217;un mot de passe est incorrect n&#8217;est pas aussi simple que cela en a l&#8217;air.</p>
<p><br />Lorsque vous vous loguez la premi&#232;re fois, Windows place le mot de passe dans un cache sp&#233;cial [2, 4] qui conserve les mots de passe des 10 derniers utilisateurs. Ainsi si vous verrouillez votre session, le d&#233;verrouillage sera instantan&#233; car Windows consid&#232;re que si le mot de passe est plac&#233; dans le cache alors il est r&#233;put&#233; valid&#233;.<br />Le cache permet m&#234;me de se reconnecter si par hasard vous n&#8217;aviez plus de connexion &#224; ce moment l&#224;.</p>
<p>Evidement vous allez me dire que m&#234;me sans &#234;tre connect&#233; &#224; mon serveur de domaine favori, je peux tout de m&#234;me me reconnecter &#224; ma machine.<br />Encore une fois c&#8217;est le cache de mots de passe qui agit dans les coulisses.</p>
<p><br />Je ne le savais pas, mais il est possible de le d&#233;sactiver pour faire une blague d&#233;sopilante &#224; un coll&#232;gue qui part faire un avant vente en client&#232;le par exemple [3].</p>
<p>&#8230;</p>
<p><br />D&#233;connez pas les gars ! <br />La vraie raison de cette possibilit&#233; est simplement de garantir qu&#8217;il est impossible de se connecter dans un contexte de s&#233;curit&#233; obsol&#232;te.</p>
<p><br />Revenons &#224; notre histoire. Il y a 3 cas de figure :</p>
<ol>
<li>Le mot de passe saisi se trouve dans le cache. Super, il est donc valide et on se connecte direct, c&#8217;est rapide.</li>
<li>Il n&#8217;est pas dans le cache : il faut interroger le contr&#244;leur de domaine, c&#8217;est plus ou moins long.</li>
<li>Il est dans le cache, mais la saisie est invalide. Dans ce cas on retourne imm&#233;diatement KO et c&#8217;est rapide&#8230;<br /><br />Vraiment ?</li>
</ol>
<p><br />Et bien pas tout &#224; fait. Il se pourrait parfaitement que la saisie soit en fait valide, mais que ce soit juste le hachage stock&#233; dans le cache qui ne l&#8217;est plus parce que votre admin ador&#233; (ou vous-m&#234;me) a modifi&#233; le mot de passe depuis un autre machine. Il faut donc tester ce cas de figure l&#224; aussi en interrogeant le contr&#244;leur de domaine.<br />Evidement ce n&#8217;est pas gratuit.</p>
<p><br />Il existe une autre raison plus subtile qui explique que tester un mot de passe invalide soit un peu plus long : le syst&#232;me ajoute automatiquement quelques secondes d&#8217;attente.<br />C&#8217;est bizarre vu comme cela, mais cette mesure limite le risque d&#8217;attaques avec des dictionnaires de mots de passe en augmentant de fa&#231;on rapidement disproportionn&#233;e le temps moyen n&#233;cessaire pour craquer le mot de passe.</p>
<p><strong>Bibliographie</strong></p>
<p>[1] The Old New Thing<br /><a href="http://blogs.msdn.com/oldnewthing/archive/2010/03/23/9983312.aspx"><a href="http://blogs.msdn.com/oldnewthing/archive/2010/03/23/9983312.aspx">http://blogs.msdn.com/oldnewthing/archive/2010/03/23/9983312.aspx</a></a><br />[2] S&#233;curit&#233; des informations d'identification mises en cache dans Windows Server 2003, dans Windows XP et dans Windows 2000 (en fran&#231;ais !!!!)<br /><a href="http://support.microsoft.com/kb/913485"><a href="http://support.microsoft.com/kb/913485">http://support.microsoft.com/kb/913485</a></a><br />[3] Restricting cached credentials in Windows<br /><a href="http://searchwinit.techtarget.com/tip/0,289483,sid1_gci968000,00.html"><a href="http://searchwinit.techtarget.com/tip/0,289483,sid1_gci968000,00.html">http://searchwinit.techtarget.com/tip/0,289483,sid1_gci968000,00.html</a></a><br />[4] Windows Confidential<br /><a href="http://technet.microsoft.com/en-us/magazine/2009.07.windowsconfidential.aspx"><a href="http://technet.microsoft.com/en-us/magazine/2009.07.windowsconfidential.aspx">http://technet.microsoft.com/en-us/magazine/2009.07.windowsconfidential.aspx</a></a></p>
<p>&#160;</p><div class="item_footer"><p><small><a href="http://www.dotnetguru2.org/amethyste/index.php/2010/04/02/pourquoi-il-faut-plus-de-temps-pour-rejeter-un-mot-de-passe-invalide-que-pour-en-accepter-un-correct">Original post</a> blogged on <a href="http://b2evolution.net/">b2evolution</a>.</small></p></div>]]></content:encoded>
								<comments>http://www.dotnetguru2.org/amethyste/index.php/2010/04/02/pourquoi-il-faut-plus-de-temps-pour-rejeter-un-mot-de-passe-invalide-que-pour-en-accepter-un-correct#comments</comments>
			<wfw:commentRss>http://www.dotnetguru2.org/amethyste/index.php?tempskin=_rss2&#38;disp=comments&#38;p=1213</wfw:commentRss>
		</item>
				<item>
			<title>Une premi&#232;re mondiale!</title>
			<link>http://www.dotnetguru2.org/amethyste/index.php/2010/04/02/une-premiere-mondiale</link>
			<pubDate>Fri, 02 Apr 2010 21:51:29 +0000</pubDate>			<dc:creator>amethyste</dc:creator>
			<category domain="main">focus</category>			<guid isPermaLink="false">1212@http://www.dotnetguru2.org/</guid>
						<description>&lt;p&gt;Et oui, j'ai r&amp;#233;alis&amp;#233; une v&amp;#233;ritable premi&amp;#232;re mondiale. Ce fut dur, des mois de travail, l'exploit fr&amp;#244;l&amp;#233; &amp;#224; plusieurs reprises. Mais j'y suis enfin arriv&amp;#233;.&lt;/p&gt;
&lt;p&gt;Je vais devenir riche et c&amp;#233;l&amp;#232;bre, &amp;#224; c&amp;#244;t&amp;#233; les Turing, Gates et autres Jobs deviendront des confr&amp;#232;res, sympas, gentils et motiv&amp;#233;s, mais des confr&amp;#232;res.&lt;/p&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;p&gt;Qu'ai-je r&amp;#233;ussi d'extraordinaire????&lt;/p&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;background-color: #ff6600;&quot;&gt;J'ai trouv&amp;#233; comment on fait un diaporama PowerPoint &lt;strong&gt;SANS&lt;/strong&gt; fond sonore&lt;/span&gt;. Si si, rien que &amp;#231;a.&lt;/p&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;p&gt;La technique est complexe je l'avoue et d'ailleurs j'organise des formations si vous avez du mal.&lt;/p&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;p&gt;Voici comment faire:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Vous &lt;strong&gt;n'allez pas&lt;/strong&gt; dans l'onglet Insertion&lt;/li&gt;
&lt;li&gt;Si vous devez aller dans cet onglet pour des raisons professionnelles. &lt;strong&gt;Vous ne cliquez pas&lt;/strong&gt; sur l'ic&amp;#244;ne SON qui est tout &amp;#224; droite.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;p&gt;Je n'explique pas encore bien comment cela arrive, mais peut &amp;#234;tre les MVP qui me lisent ont des infos qui ne soient pas NDA. Et bien cela n'ins&amp;#232;re AUCUN fond sonore.&lt;/p&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;p&gt;J'en voit dont la machoire vient de tomber &amp;#224; terre.&lt;/p&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;div class=&quot;item_footer&quot;&gt;&lt;p&gt;&lt;small&gt;&lt;a href=&quot;http://www.dotnetguru2.org/amethyste/index.php/2010/04/02/une-premiere-mondiale&quot;&gt;Original post&lt;/a&gt; blogged on &lt;a href=&quot;http://b2evolution.net/&quot;&gt;b2evolution&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;&lt;/div&gt;</description>
			<content:encoded><![CDATA[<p>Et oui, j'ai r&#233;alis&#233; une v&#233;ritable premi&#232;re mondiale. Ce fut dur, des mois de travail, l'exploit fr&#244;l&#233; &#224; plusieurs reprises. Mais j'y suis enfin arriv&#233;.</p>
<p>Je vais devenir riche et c&#233;l&#232;bre, &#224; c&#244;t&#233; les Turing, Gates et autres Jobs deviendront des confr&#232;res, sympas, gentils et motiv&#233;s, mais des confr&#232;res.</p>
<p>&#160;</p>
<p>Qu'ai-je r&#233;ussi d'extraordinaire????</p>
<p>&#160;</p>
<p><span style="background-color: #ff6600;">J'ai trouv&#233; comment on fait un diaporama PowerPoint <strong>SANS</strong> fond sonore</span>. Si si, rien que &#231;a.</p>
<p>&#160;</p>
<p>La technique est complexe je l'avoue et d'ailleurs j'organise des formations si vous avez du mal.</p>
<p>&#160;</p>
<p>Voici comment faire:</p>
<ol>
<li>Vous <strong>n'allez pas</strong> dans l'onglet Insertion</li>
<li>Si vous devez aller dans cet onglet pour des raisons professionnelles. <strong>Vous ne cliquez pas</strong> sur l'ic&#244;ne SON qui est tout &#224; droite.</li>
</ol>
<p>&#160;</p>
<p>Je n'explique pas encore bien comment cela arrive, mais peut &#234;tre les MVP qui me lisent ont des infos qui ne soient pas NDA. Et bien cela n'ins&#232;re AUCUN fond sonore.</p>
<p>&#160;</p>
<p>J'en voit dont la machoire vient de tomber &#224; terre.</p>
<p>&#160;</p><div class="item_footer"><p><small><a href="http://www.dotnetguru2.org/amethyste/index.php/2010/04/02/une-premiere-mondiale">Original post</a> blogged on <a href="http://b2evolution.net/">b2evolution</a>.</small></p></div>]]></content:encoded>
								<comments>http://www.dotnetguru2.org/amethyste/index.php/2010/04/02/une-premiere-mondiale#comments</comments>
			<wfw:commentRss>http://www.dotnetguru2.org/amethyste/index.php?tempskin=_rss2&#38;disp=comments&#38;p=1212</wfw:commentRss>
		</item>
				<item>
			<title>Lancer une application WPF si l'on a plusieurs &#233;crans</title>
			<link>http://www.dotnetguru2.org/amethyste/index.php/2009/11/01/lancer-une-application-wpf-si-l-on-a-plusieurs-ecrans</link>
			<pubDate>Sun, 01 Nov 2009 14:47:39 +0000</pubDate>			<dc:creator>amethyste</dc:creator>
			<category domain="main">focus</category>			<guid isPermaLink="false">1162@http://www.dotnetguru2.org/</guid>
						<description>&lt;p&gt;Je travaille en g&amp;#233;n&amp;#233;ral avec deux &amp;#233;crans et il m'arrive donc fr&amp;#233;quemment de d&amp;#233;placer d'un &amp;#233;cran &amp;#224; l'autre l'application que je viens de lancer depuis VS. Op&amp;#233;ration que j'ai toujours trouv&amp;#233;e non pas difficile, mais p&amp;#233;nible &amp;#224; faire continuellement.&lt;/p&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;p&gt;J'ai d&amp;#233;couvert cette semaine par hasard qu'en fait c'est relativement inutile puisque l'algorithme de d&amp;#233;marrage de VS est plus intelligent que moi.&lt;/p&gt;
&lt;p&gt;Au lancement de l'application il &quot;regarde&quot; dans quelle fen&amp;#234;tre se trouve le curseur souris et c'est dans cette fen&amp;#234;tre qu'il lance l'application.&lt;/p&gt;
&lt;p&gt;J'ai fais des essais, cela ne marche bien qu'avec les applicatons WPF.&lt;/p&gt;
&lt;p&gt;Et la cerise sur le g&amp;#226;teau: le comportement est en fait un standard de l'application. Lancez votre EXE ind&amp;#233;pendemment de VS et &amp;#231;a marche!!!!&lt;/p&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;div class=&quot;item_footer&quot;&gt;&lt;p&gt;&lt;small&gt;&lt;a href=&quot;http://www.dotnetguru2.org/amethyste/index.php/2009/11/01/lancer-une-application-wpf-si-l-on-a-plusieurs-ecrans&quot;&gt;Original post&lt;/a&gt; blogged on &lt;a href=&quot;http://b2evolution.net/&quot;&gt;b2evolution&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;&lt;/div&gt;</description>
			<content:encoded><![CDATA[<p>Je travaille en g&#233;n&#233;ral avec deux &#233;crans et il m'arrive donc fr&#233;quemment de d&#233;placer d'un &#233;cran &#224; l'autre l'application que je viens de lancer depuis VS. Op&#233;ration que j'ai toujours trouv&#233;e non pas difficile, mais p&#233;nible &#224; faire continuellement.</p>
<p>&#160;</p>
<p>J'ai d&#233;couvert cette semaine par hasard qu'en fait c'est relativement inutile puisque l'algorithme de d&#233;marrage de VS est plus intelligent que moi.</p>
<p>Au lancement de l'application il "regarde" dans quelle fen&#234;tre se trouve le curseur souris et c'est dans cette fen&#234;tre qu'il lance l'application.</p>
<p>J'ai fais des essais, cela ne marche bien qu'avec les applicatons WPF.</p>
<p>Et la cerise sur le g&#226;teau: le comportement est en fait un standard de l'application. Lancez votre EXE ind&#233;pendemment de VS et &#231;a marche!!!!</p>
<p>&#160;</p><div class="item_footer"><p><small><a href="http://www.dotnetguru2.org/amethyste/index.php/2009/11/01/lancer-une-application-wpf-si-l-on-a-plusieurs-ecrans">Original post</a> blogged on <a href="http://b2evolution.net/">b2evolution</a>.</small></p></div>]]></content:encoded>
								<comments>http://www.dotnetguru2.org/amethyste/index.php/2009/11/01/lancer-une-application-wpf-si-l-on-a-plusieurs-ecrans#comments</comments>
			<wfw:commentRss>http://www.dotnetguru2.org/amethyste/index.php?tempskin=_rss2&#38;disp=comments&#38;p=1162</wfw:commentRss>
		</item>
				<item>
			<title>WPF : D&#233;bogage des bindings [ajout]</title>
			<link>http://www.dotnetguru2.org/amethyste/index.php/2009/10/16/wpf-debogage-des-bindings</link>
			<pubDate>Fri, 16 Oct 2009 18:22:03 +0000</pubDate>			<dc:creator>amethyste</dc:creator>
			<category domain="main">focus</category>			<guid isPermaLink="false">1150@http://www.dotnetguru2.org/</guid>
						<description>&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 10pt&quot;&gt;&lt;span style=&quot;font-family: Calibri; font-size: small;&quot;&gt;Les bindings c&amp;#8217;est r&amp;#233;ellement une des forces de WPF. Mais parfois ils peuvent ne pas fonctionner ou bien ne pas charger le r&amp;#233;sultat attendu.&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 10pt&quot;&gt;&lt;span style=&quot;font-family: Calibri; font-size: small;&quot;&gt;Comment faire pour obtenir des informations de plus bas niveau que de simplement constater que cela ne marche pas&amp;#160;?&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 10pt&quot;&gt;&lt;span style=&quot;font-family: Calibri; font-size: small;&quot;&gt;Dans le cas o&amp;#249; une exception est lev&amp;#233;e, le plus simple est de faire &lt;em style=&quot;mso-bidi-font-style: normal&quot;&gt;View/Output&lt;/em&gt; et regarder ce qui se passe dans la console de sortie. On va par exemple trouver ceci&amp;#160;:&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 10pt&quot;&gt;&lt;span style=&quot;font-family: Calibri; font-size: small;&quot;&gt;
&lt;table border=&quot;0&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;FONT-FAMILY: 'Courier New'; FONT-SIZE: 8pt; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-fareast-language: EN-US; mso-ansi-language: EN-US; mso-bidi-language: AR-SA; mso-no-proof: yes&quot; lang=&quot;EN-US&quot;&gt;System.Windows.Data Error: 4 : Cannot find source for binding with reference 'ElementName=zoomSlider'. BindingExpression:Path=Value; DataItem=null; target element is 'ScaleTransform' (HashCode=34917486); target property is 'ScaleX' (type 'Double')&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 10pt&quot;&gt;&lt;span style=&quot;font-family: Calibri; font-size: small;&quot;&gt;Parfois ce n&amp;#8217;est pas suffisant ou bien le binding ne l&amp;#232;ve pas d&amp;#8217;exception, mais ne se lie pas &amp;#224; la source que l&amp;#8217;on pense.&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 10pt&quot;&gt;&lt;span style=&quot;font-family: Calibri; font-size: small;&quot;&gt;Ouvrez alors votre code XAML et d&amp;#233;clarez l&amp;#8217;espace de noms suivant&amp;#160;:&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 10pt&quot;&gt;&amp;#160;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;xmlns:diag=&quot;clr-namespace:System.Diagnostics;assembly=WindowsBase&quot;&lt;/em&gt;&amp;#160;&lt;/p&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 10pt;&quot;&gt;&lt;span style=&quot;font-family: Calibri; font-size: small;&quot;&gt;Vous pouvez lui attribuer le tagkey que vous souhaitez, j&amp;#8217;ai choisis &lt;em style=&quot;mso-bidi-font-style: normal;&quot;&gt;diag&lt;/em&gt;, mais &lt;em style=&quot;mso-bidi-font-style: normal;&quot;&gt;zjergtziuyaziuefgapiugzpiufgzffiudgf&lt;/em&gt; fait aussi l&amp;#8217;affaire si cela vous para&amp;#238;t plus clair&amp;#160;!&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 10pt;&quot;&gt;&lt;span style=&quot;font-family: Calibri; font-size: small;&quot;&gt;L&amp;#8217;&amp;#233;tape suivante consiste &amp;#224; rep&amp;#233;rer le binding que l&amp;#8217;on souhaite auditer, dans notre cas&amp;#160;:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;p&gt;&amp;lt;ScaleTransform ScaleX=&quot;&lt;strong&gt;{&lt;/strong&gt;&lt;strong&gt;Binding&lt;/strong&gt;&lt;strong&gt; ElementName&lt;/strong&gt;&lt;strong&gt;=zoomSlider,&lt;/strong&gt;&lt;strong&gt; &lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Path=Value}&lt;/strong&gt;&lt;strong&gt;&quot;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ScaleY=&quot;&lt;strong&gt;{&lt;/strong&gt;&lt;strong&gt;Binding ElementName=zoomSlider, &lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/strong&gt;&lt;strong&gt;Path&lt;/strong&gt;&lt;strong&gt;=Value}&lt;/strong&gt;&quot; /&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;/TabControl.LayoutTransform&amp;gt;&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 10pt;&quot;&gt;
&lt;p class=&quot;MsoNormal&quot; style=&quot;margin: 0cm 0cm 10pt;&quot;&gt;&amp;#160;&lt;/p&gt;
&lt;/p&gt;
&lt;p&gt;On effectue la modification suivante&amp;#160;:&lt;/p&gt;
&lt;p&gt;
&lt;table border=&quot;1&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td width=&quot;614&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;&amp;lt;ScaleTransform ScaleX=&quot;{Binding ElementName=zoomSlider,&lt;/p&gt;
&lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Path=Value,&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;#160;&amp;#160;&lt;strong&gt;diag&lt;/strong&gt;&lt;strong&gt;:PresentationTraceSources.TraceLevel=High}&quot;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ScaleY=&quot;{Binding ElementName=zoomSlider,&lt;/p&gt;
&lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Path=Value}&quot;/&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;/TabControl.LayoutTransform&amp;gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/p&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;p&gt;On relance et consulte &amp;#224; nouveau la console de sortie. On retrouve &amp;#233;videmment les deux messages pr&amp;#233;c&amp;#233;dents, mais avant&amp;#160;:&lt;/p&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;p&gt;
&lt;table border=&quot;1&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td width=&quot;614&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;System.Windows.Data Warning: 63 : BindingExpression (hash=42815147): Resolving source&lt;/p&gt;
&lt;p&gt;System.Windows.Data Warning: 66 : BindingExpression (hash=42815147): Found data context element: &amp;lt;null&amp;gt; (OK)&lt;/p&gt;
&lt;p&gt;System.Windows.Data Warning: 70 :&amp;#160;&amp;#160;&amp;#160;&amp;#160; Lookup name zoomSlider:&amp;#160; queried DockPanel (hash=64981649)&lt;/p&gt;
&lt;p&gt;System.Windows.Data Warning: 63 : BindingExpression (hash=42815147): Resolving source&lt;/p&gt;
&lt;p&gt;System.Windows.Data Warning: 66 : BindingExpression (hash=42815147): Found data context element: &amp;lt;null&amp;gt; (OK)&lt;/p&gt;
&lt;p&gt;System.Windows.Data Warning: 70 :&amp;#160;&amp;#160;&amp;#160;&amp;#160; Lookup name zoomSlider:&amp;#160; queried DockPanel (hash=64981649)&lt;/p&gt;
&lt;p&gt;System.Windows.Data Warning: 63 : BindingExpression (hash=42815147): Resolving source&amp;#160; (last chance)&lt;/p&gt;
&lt;p&gt;System.Windows.Data Warning: 66 : BindingExpression (hash=42815147): Found data context element: &amp;lt;null&amp;gt; (OK)&lt;/p&gt;
&lt;p&gt;System.Windows.Data Warning: 70 :&amp;#160;&amp;#160;&amp;#160;&amp;#160; Lookup name zoomSlider: &amp;#160;queried DockPanel (hash=64981649)&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/p&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;p&gt;Le log me dit que WPF va chercher le &lt;em&gt;DataContext&lt;/em&gt; dans un &lt;em&gt;DocPanel&lt;/em&gt;. Or mon binding ne se trouve pas dans un &lt;em&gt;DockPanel&lt;/em&gt;&amp;#160;?&lt;/p&gt;
&lt;p&gt;Que se passe-t-il&amp;#160;?&lt;/p&gt;
&lt;p&gt;Je fais une recherche dans les diff&amp;#233;rents XAML et d&amp;#233;couvre un &lt;em&gt;ScaleTransform&lt;/em&gt; oubli&amp;#233; dans un &lt;em&gt;UserControl&lt;/em&gt;. A l'origine c'est lui qui contenait le &lt;em&gt;Slider&lt;/em&gt;, mais j'ai d&amp;#233;plac&amp;#233; celui-ci et oubli&amp;#233; le &lt;em&gt;ScaleTransform&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Une fois celui-ci supprim&amp;#233;, tout est rentr&amp;#233; dans l'ordre&amp;#160;!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Moralit&amp;#233;&lt;/strong&gt;&amp;#160;: utilisez des ressources&amp;#160;plut&amp;#244;t qu'une d&amp;#233;claration directe dans les templates !!!!&lt;/p&gt;
&lt;p&gt;Dans un de ses blogs, Thomas Lebrun propose un script de validation des bindings&amp;#160;:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://blogs.developpeur.org/tom/archive/2008/11/06/wpf-valider-les-binding-wpf.aspx&quot;&gt;&lt;a href=&quot;http://blogs.developpeur.org/tom/archive/2008/11/06/wpf-valider-les-binding-wpf.aspx&quot;&gt;http://blogs.developpeur.org/tom/archive/2008/11/06/wpf-valider-les-binding-wpf.aspx&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Honn&amp;#234;tement je ne suis pas arriv&amp;#233; &amp;#224; comprendre ce qu'il valide au juste&amp;#160;! Si quelqu'un a une id&amp;#233;e&amp;#160;?&lt;/p&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;p&gt;AJOUT: je viens de trouver ce blog de Bea Stollnitz qui aborde la m&amp;#234;me question, mais avec des m&amp;#233;thodes suppl&amp;#233;mentaires:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://bea.stollnitz.com/blog/?p=52&quot;&gt;&lt;a href=&quot;http://bea.stollnitz.com/blog/?p=52&quot;&gt;http://bea.stollnitz.com/blog/?p=52&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;div class=&quot;item_footer&quot;&gt;&lt;p&gt;&lt;small&gt;&lt;a href=&quot;http://www.dotnetguru2.org/amethyste/index.php/2009/10/16/wpf-debogage-des-bindings&quot;&gt;Original post&lt;/a&gt; blogged on &lt;a href=&quot;http://b2evolution.net/&quot;&gt;b2evolution&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;&lt;/div&gt;</description>
			<content:encoded><![CDATA[<p class="MsoNormal" style="MARGIN: 0cm 0cm 10pt"><span style="font-family: Calibri; font-size: small;">Les bindings c&#8217;est r&#233;ellement une des forces de WPF. Mais parfois ils peuvent ne pas fonctionner ou bien ne pas charger le r&#233;sultat attendu.</span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 10pt"><span style="font-family: Calibri; font-size: small;">Comment faire pour obtenir des informations de plus bas niveau que de simplement constater que cela ne marche pas&#160;?</span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 10pt"><span style="font-family: Calibri; font-size: small;">Dans le cas o&#249; une exception est lev&#233;e, le plus simple est de faire <em style="mso-bidi-font-style: normal">View/Output</em> et regarder ce qui se passe dans la console de sortie. On va par exemple trouver ceci&#160;:</span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 10pt"><span style="font-family: Calibri; font-size: small;">
<table border="0">
<tbody>
<tr>
<td><span style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 8pt; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-fareast-language: EN-US; mso-ansi-language: EN-US; mso-bidi-language: AR-SA; mso-no-proof: yes" lang="EN-US">System.Windows.Data Error: 4 : Cannot find source for binding with reference 'ElementName=zoomSlider'. BindingExpression:Path=Value; DataItem=null; target element is 'ScaleTransform' (HashCode=34917486); target property is 'ScaleX' (type 'Double')</span></td>
</tr>
</tbody>
</table>
</span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 10pt"><span style="font-family: Calibri; font-size: small;">Parfois ce n&#8217;est pas suffisant ou bien le binding ne l&#232;ve pas d&#8217;exception, mais ne se lie pas &#224; la source que l&#8217;on pense.</span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 10pt"><span style="font-family: Calibri; font-size: small;">Ouvrez alors votre code XAML et d&#233;clarez l&#8217;espace de noms suivant&#160;:</span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 10pt">&#160;</p>
<p><em>xmlns:diag="clr-namespace:System.Diagnostics;assembly=WindowsBase"</em>&#160;</p>
<p>&#160;</p>
<p class="MsoNormal" style="margin: 0cm 0cm 10pt;"><span style="font-family: Calibri; font-size: small;">Vous pouvez lui attribuer le tagkey que vous souhaitez, j&#8217;ai choisis <em style="mso-bidi-font-style: normal;">diag</em>, mais <em style="mso-bidi-font-style: normal;">zjergtziuyaziuefgapiugzpiufgzffiudgf</em> fait aussi l&#8217;affaire si cela vous para&#238;t plus clair&#160;!</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 10pt;"><span style="font-family: Calibri; font-size: small;">L&#8217;&#233;tape suivante consiste &#224; rep&#233;rer le binding que l&#8217;on souhaite auditer, dans notre cas&#160;:</span></p>
<p>&#160;</p>
<p>&lt;ScaleTransform ScaleX="<strong>{</strong><strong>Binding</strong><strong> ElementName</strong><strong>=zoomSlider,</strong><strong> </strong></p>
<p><strong>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Path=Value}</strong><strong>"</strong></p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ScaleY="<strong>{</strong><strong>Binding ElementName=zoomSlider, </strong></p>
<p><strong>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </strong><strong>Path</strong><strong>=Value}</strong>" /&gt;</p>
<p>&lt;/TabControl.LayoutTransform&gt;</p>
<p class="MsoNormal" style="margin: 0cm 0cm 10pt;">
<p class="MsoNormal" style="margin: 0cm 0cm 10pt;">&#160;</p>
</p>
<p>On effectue la modification suivante&#160;:</p>
<p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="614" valign="top">
<p>&lt;ScaleTransform ScaleX="{Binding ElementName=zoomSlider,</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Path=Value,&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;<strong>diag</strong><strong>:PresentationTraceSources.TraceLevel=High}"</strong></p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ScaleY="{Binding ElementName=zoomSlider,</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Path=Value}"/&gt;</p>
<p>&lt;/TabControl.LayoutTransform&gt;</p>
</td>
</tr>
</tbody>
</table>
</p>
<p>&#160;</p>
<p>On relance et consulte &#224; nouveau la console de sortie. On retrouve &#233;videmment les deux messages pr&#233;c&#233;dents, mais avant&#160;:</p>
<p>&#160;</p>
<p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="614" valign="top">
<p>System.Windows.Data Warning: 63 : BindingExpression (hash=42815147): Resolving source</p>
<p>System.Windows.Data Warning: 66 : BindingExpression (hash=42815147): Found data context element: &lt;null&gt; (OK)</p>
<p>System.Windows.Data Warning: 70 :&#160;&#160;&#160;&#160; Lookup name zoomSlider:&#160; queried DockPanel (hash=64981649)</p>
<p>System.Windows.Data Warning: 63 : BindingExpression (hash=42815147): Resolving source</p>
<p>System.Windows.Data Warning: 66 : BindingExpression (hash=42815147): Found data context element: &lt;null&gt; (OK)</p>
<p>System.Windows.Data Warning: 70 :&#160;&#160;&#160;&#160; Lookup name zoomSlider:&#160; queried DockPanel (hash=64981649)</p>
<p>System.Windows.Data Warning: 63 : BindingExpression (hash=42815147): Resolving source&#160; (last chance)</p>
<p>System.Windows.Data Warning: 66 : BindingExpression (hash=42815147): Found data context element: &lt;null&gt; (OK)</p>
<p>System.Windows.Data Warning: 70 :&#160;&#160;&#160;&#160; Lookup name zoomSlider: &#160;queried DockPanel (hash=64981649)</p>
</td>
</tr>
</tbody>
</table>
</p>
<p>&#160;</p>
<p>Le log me dit que WPF va chercher le <em>DataContext</em> dans un <em>DocPanel</em>. Or mon binding ne se trouve pas dans un <em>DockPanel</em>&#160;?</p>
<p>Que se passe-t-il&#160;?</p>
<p>Je fais une recherche dans les diff&#233;rents XAML et d&#233;couvre un <em>ScaleTransform</em> oubli&#233; dans un <em>UserControl</em>. A l'origine c'est lui qui contenait le <em>Slider</em>, mais j'ai d&#233;plac&#233; celui-ci et oubli&#233; le <em>ScaleTransform</em>.</p>
<p>Une fois celui-ci supprim&#233;, tout est rentr&#233; dans l'ordre&#160;!</p>
<p><strong>Moralit&#233;</strong>&#160;: utilisez des ressources&#160;plut&#244;t qu'une d&#233;claration directe dans les templates !!!!</p>
<p>Dans un de ses blogs, Thomas Lebrun propose un script de validation des bindings&#160;:</p>
<p><a href="http://blogs.developpeur.org/tom/archive/2008/11/06/wpf-valider-les-binding-wpf.aspx"><a href="http://blogs.developpeur.org/tom/archive/2008/11/06/wpf-valider-les-binding-wpf.aspx">http://blogs.developpeur.org/tom/archive/2008/11/06/wpf-valider-les-binding-wpf.aspx</a></a></p>
<p>Honn&#234;tement je ne suis pas arriv&#233; &#224; comprendre ce qu'il valide au juste&#160;! Si quelqu'un a une id&#233;e&#160;?</p>
<p>&#160;</p>
<p>AJOUT: je viens de trouver ce blog de Bea Stollnitz qui aborde la m&#234;me question, mais avec des m&#233;thodes suppl&#233;mentaires:</p>
<p><a href="http://bea.stollnitz.com/blog/?p=52"><a href="http://bea.stollnitz.com/blog/?p=52">http://bea.stollnitz.com/blog/?p=52</a></a></p>
<p>&#160;</p>
<p>&#160;</p><div class="item_footer"><p><small><a href="http://www.dotnetguru2.org/amethyste/index.php/2009/10/16/wpf-debogage-des-bindings">Original post</a> blogged on <a href="http://b2evolution.net/">b2evolution</a>.</small></p></div>]]></content:encoded>
								<comments>http://www.dotnetguru2.org/amethyste/index.php/2009/10/16/wpf-debogage-des-bindings#comments</comments>
			<wfw:commentRss>http://www.dotnetguru2.org/amethyste/index.php?tempskin=_rss2&#38;disp=comments&#38;p=1150</wfw:commentRss>
		</item>
				<item>
			<title>les cha&#238;nes de connexion</title>
			<link>http://www.dotnetguru2.org/amethyste/index.php/2009/07/18/les_chaines_de_connexion</link>
			<pubDate>Sat, 18 Jul 2009 11:50:24 +0000</pubDate>			<dc:creator>amethyste</dc:creator>
			<category domain="main">focus</category>			<guid isPermaLink="false">1093@http://www.dotnetguru2.org/</guid>
						<description>&lt;p&gt;Un article sans autre pr&amp;#233;tention que rassembler un certain nombre d&amp;#8217;informations en g&amp;#233;n&amp;#233;ral assez &amp;#233;parses sur les cha&amp;#238;nes de connexion.&lt;br /&gt;
Il n&amp;#8217;y a pas d&amp;#8217;ordre particulier, juste des chapitres qui se suivent.&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;&lt;strong&gt;un peu d'orthographe&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&amp;#8226;	En anglais on &amp;#233;crit : conne&lt;strong&gt;ct&lt;/strong&gt;ion&lt;br /&gt;
&amp;#8226;	Par contre en fran&amp;#231;ais : conne&lt;strong&gt;x&lt;/strong&gt;ion, avec un x.&lt;/p&gt;

&lt;p&gt;Allez donc relire votre doc et vos commentaires&amp;#8230;&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;&lt;strong&gt;Sauver une cha&amp;#238;ne dans une application .net&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Examinons diff&amp;#233;rents conteneurs, sans pr&amp;#233;tendre &amp;#234;tre exhaustif.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Le code&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Cette possibilit&amp;#233; est assez rare car dans la majorit&amp;#233; des cas il s&amp;#8217;agit plut&amp;#244;t d&amp;#8217;une faute de codage. Avant de l&amp;#8217;adopter, &amp;#233;valuez en les avantages et les inconv&amp;#233;nients avec soin.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Le fichier de configuration&lt;/strong&gt;&lt;/p&gt;


&lt;p&gt;Depuis .NET 2.0 est apparue la structure &amp;lt;connectionStrings&gt;.&lt;br /&gt;
Par exemple :&lt;/p&gt;

&lt;pre class=&quot;csharpcode&quot;&gt;
&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;connectionStrings&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;add&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;nomChaineConnexion&quot;&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;connectionString&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;XXXXXXXX&quot;&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;connectionStrings&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;&lt;b&gt;name&lt;/b&gt;: Nom du conteneur&lt;br /&gt;
&lt;b&gt;connectionString&lt;/b&gt;: Cha&amp;#238;ne de connexion&lt;/p&gt;

&lt;p&gt;C&amp;#244;t&amp;#233; code, la r&amp;#233;cup&amp;#233;ration de la cha&amp;#238;ne se fait ainsi :&lt;/p&gt;

&lt;pre class=&quot;csharpcode&quot;&gt;
ConnectionStringSettings chaine = ConfigurationManager.ConnectionStrings[&lt;span class=&quot;str&quot;&gt;&quot;nomChaineConnexion&quot;&lt;/span&gt;];&lt;/pre&gt;

&lt;p&gt;Le nom du conteneur peut faire l&amp;#8217;objet d&amp;#8217;une entr&amp;#233;e dans la section &amp;lt;appSettings &gt;  que l&amp;#8217;on peut alors relire en interrogeant le dictionnaire &lt;em&gt;ConfigurationManager.AppSettings&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;La classe &lt;em&gt;ConnectionStringSettings &lt;/em&gt;propose diverses propri&amp;#233;t&amp;#233;s, mais celle qui vous int&amp;#233;ressera le plus est &lt;em&gt;ConnectionString &lt;/em&gt;qui est du type String et retourne biens s&amp;#251;r notre cha&amp;#238;ne.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Qu'en est t'il c&amp;#244;t&amp;#233; s&amp;#233;curit&amp;#233;?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Par d&amp;#233;faut ASP.NET est configur&amp;#233; pour ne jamais t&amp;#233;l&amp;#233;charger le fichier web.config. On n&amp;#8217;a donc pas de risque de le voir appara&amp;#238;tre en navigant sur le site.&lt;/p&gt;

&lt;p&gt;Le r&amp;#233;glage est fait dans le fichier &lt;strong&gt;web.config&lt;/strong&gt; par d&amp;#233;faut situ&amp;#233; dans :&lt;/p&gt;

&lt;p&gt;%SystemRoot%\ Microsoft.NET\Framework\v2.0.50727\CONFIG&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Ce fichier est apparu avec .NET 2.0, le param&amp;#233;trage se trouve dans machine.config dans les versions ant&amp;#233;rieures de .NET.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Ce dernier fichier se trouvant hors r&amp;#233;pertoire virtuel, il est donc consid&amp;#233;r&amp;#233; comme raisonnablement s&amp;#251;r pour une application Web, d&amp;#8217;autant plus que des ACL sont pos&amp;#233;es sur ce fichier lors de l&amp;#8217;installation de .NET.&lt;/p&gt;

&lt;p&gt;La protection contre les attaques ext&amp;#233;rieures est donc s&amp;#251;re. &lt;/p&gt;

&lt;p&gt;On peut encore augmenter la s&amp;#233;curit&amp;#233; en cryptant la cha&amp;#238;ne de connexion &amp;#224; l&amp;#8217;aide de l&amp;#8217;outil aspnet_regiis.exe livr&amp;#233; avec ASP.NET.&lt;br /&gt;
Faisons ensemble une petite d&amp;#233;monstration, mais sinon reportez vous &amp;#224; la r&amp;#233;f&amp;#233;rence [6] pour plus de d&amp;#233;tails.&lt;br /&gt;
Par exemple (mais d&amp;#8217;autres syntaxes existent):&lt;/p&gt;


&lt;p&gt;aspnet_regiis -pef &quot;connectionStrings&quot; &quot;C:\Projets\....&quot;&lt;/p&gt;

&lt;p&gt;Notez que l&amp;#8217;un des param&amp;#232;tres est la section que l&amp;#8217;on souhaite crypter, on n&amp;#8217;est donc pas limit&amp;#233; aux cha&amp;#238;nes de connexion.&lt;br /&gt;
Le r&amp;#233;sultat ressemble &amp;#224; ceci :&lt;/p&gt;

&lt;pre class=&quot;csharpcode&quot;&gt;
&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;connectionStrings&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;configProtectionProvider&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;RsaProtectedConfigurationProvider&quot;&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;EncryptedData&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;Type&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;http://www.w3.org/2001/04/xmlenc#Element&quot;&lt;/span&gt;
      &lt;span class=&quot;attr&quot;&gt;xmlns&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;http://www.w3.org/2001/04/xmlenc#&quot;&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;EncryptionMethod&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;Algorithm&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;http://www.w3.org/2001/04/xmlenc#tripledes-cbc&quot;&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;KeyInfo&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;xmlns&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;http://www.w3.org/2000/09/xmldsig#&quot;&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;EncryptedKey&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;xmlns&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;http://www.w3.org/2001/04/xmlenc#&quot;&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;
          &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;EncryptionMethod&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;Algorithm&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;http://www.w3.org/2001/04/xmlenc#rsa-1_5&quot;&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;/&amp;gt;&lt;/span&gt;
          &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;KeyInfo&lt;/span&gt; &lt;span class=&quot;attr&quot;&gt;xmlns&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;=&quot;http://www.w3.org/2000/09/xmldsig#&quot;&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;
            &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;KeyName&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;Rsa Key&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;KeyName&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;
          &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;KeyInfo&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;
          &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;CipherData&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;
            &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;CipherValue&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;BkzayktAAs&amp;#8230;.BDkjEuG3ZVRs/M=&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;CipherValue&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;
          &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;CipherData&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;EncryptedKey&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;KeyInfo&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;CipherData&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;CipherValue&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;UFds9Ssuc6+gHRwt3G&amp;#8230;bWqQS31ha&lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;CipherValue&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;CipherData&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;EncryptedData&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;kwrd&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;html&quot;&gt;connectionStrings&lt;/span&gt;&lt;span class=&quot;kwrd&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;Notez plusieurs choses importantes :&lt;/p&gt;

&lt;p&gt;&amp;#8226;	C&amp;#8217;est transparent pour votre code&lt;br /&gt;
&amp;#8226;	L&amp;#8217;op&amp;#233;ration est r&amp;#233;versible&lt;br /&gt;
&amp;#8226;	Le r&amp;#233;sultat du cryptage est, par d&amp;#233;faut, sp&amp;#233;cifique &amp;#224; la machine sur lequel il a &amp;#233;t&amp;#233; effectu&amp;#233;, mais il est possible de mettre en place un conteneur RSA particulier comme expliqu&amp;#233; en [7]&lt;/p&gt;

&lt;p&gt;A ma connaissance cet outil ne s&amp;#8217;applique qu&amp;#8217;au fichier web .config, du moins je ne suis pas parvenu &amp;#224; l&amp;#8217;appliquer &amp;#224; un fichier de configuration d&amp;#8217;une application console. Si quelqu&amp;#8217;un sait faire sans avoir &amp;#224; renommer le fichier&amp;#8230;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fichier udl (universal data link)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Pour cr&amp;#233;er un fichier udl :&lt;br /&gt;
&amp;#8226;	Naviguez jusqu&amp;#8217;au r&amp;#233;pertoire o&amp;#249; vous souhaitez le d&amp;#233;poser&lt;br /&gt;
&amp;#8226;	Cr&amp;#233;ez un fichier texte avec l&amp;#8217;extension .udl&lt;br /&gt;
&amp;#8226;	Double cliquez dessus. Une fen&amp;#234;tre suivante s&amp;#8217;ouvre&lt;br /&gt;
&amp;#8226;	Remplissez la boite de dialogue. &lt;/p&gt;

&lt;p&gt;Une fois termin&amp;#233;, le fichier contiendra la cha&amp;#238;ne de connexion compl&amp;#232;te.&lt;/p&gt;

&lt;p&gt;Au sujet du choix du fournisseur, notez que seul OLE DB est support&amp;#233; par ADO.NET avec les fichiers udl. Mais c&amp;#8217;est un moyen que j&amp;#8217;aime bien utiliser pour construire une cha&amp;#238;ne de connexion.&lt;/p&gt;

&lt;p&gt;C&amp;#244;t&amp;#233; code maintenant. Disons que votre fichier se nomme monFichierAMoi.udl.&lt;/p&gt;


&lt;pre class=&quot;csharpcode&quot;&gt;
OleDbConnection myConnection = &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; OleDbConnection(&lt;span class=&quot;str&quot;&gt;&quot;File Name = c:\\monFichierAMoi.udl&quot;&lt;/span&gt;);&lt;/pre&gt;

&lt;p&gt;Vous trouverez plus d&amp;#8217;infos en [1] et [2].&lt;/p&gt;

&lt;p&gt;C&amp;#244;t&amp;#233; s&amp;#233;curit&amp;#233;?&lt;/p&gt;

&lt;p&gt;Ne surtout pas placer le fichier udl dans le r&amp;#233;pertoire virtuel car il ne sera pas prot&amp;#233;g&amp;#233; du t&amp;#233;l&amp;#233;chargement. Pour &amp;#233;viter de possibles bugs de canonicalisation [3], [4], il est m&amp;#234;me pr&amp;#233;f&amp;#233;rable de le disposer dans un volume logique diff&amp;#233;rent de celui du site.&lt;/p&gt;

&lt;p&gt;Comme tout fichier critique, il doit &amp;#234;tre prot&amp;#233;g&amp;#233; par des ACL adapt&amp;#233;s. A ce titre l&amp;#8217;acc&amp;#232;s au fichier udl peut &amp;#234;tre mieux prot&amp;#233;g&amp;#233; que celui de web.config car on peut le rendre accessible &amp;#224; nettement moins de comptes. Il y aura au moins MachineName\ASPNET qui n&amp;#8217;a besoin que d&amp;#8217;un acc&amp;#232;s en lecture.&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Dans la mesure o&amp;#249; le fichier udl peut &amp;#234;tre modifi&amp;#233; &amp;#224; l&amp;#8217;insu de l&amp;#8217;application, celui-ci n&amp;#8217;est pas mis en cache, mais lu &amp;#224; chaque appel. Cela peut avoir un impact sur les performances&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Il n&amp;#8217;est pas possible d&amp;#8217;encrypter les fichiers udl.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fichier personnalis&amp;#233;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Cette option n&amp;#8217;est int&amp;#233;ressante que si le fichier est plac&amp;#233; en dehors du r&amp;#233;pertoire virtuel pour des raisons de s&amp;#233;curit&amp;#233;.&lt;br /&gt;
Il doit &amp;#234;tre prot&amp;#233;g&amp;#233; par des ACL restrictives et id&amp;#233;alement plac&amp;#233; dans un volume distinct de l&amp;#8217;application.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Le registre&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Pour que l&amp;#8217;application ASP puisse y acc&amp;#233;der, vous devrez placer la cha&amp;#238;ne de connexion dans HKLM. Vous devrez &amp;#233;galement :&lt;br /&gt;
&amp;#8226;	Prot&amp;#233;ger la clef avec un ACL&lt;br /&gt;
&amp;#8226;	L&amp;#8217;encrypter (voir [5] pour une proc&amp;#233;dure)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cr&amp;#233;er un DSN&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Un DSN (Data Source Name) est simplement un fichier avec toutes les informations pour identifier une source de donn&amp;#233;es accessible &lt;strong&gt;via ODBC&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Il existe deux types de DSN :&lt;br /&gt;
1.	Les &lt;strong&gt;DSN utilisateur&lt;/strong&gt; qui ne sont visible que d&amp;#8217;un utilisateur sur la machine o&amp;#249; le DSN est d&amp;#233;ploy&amp;#233;&lt;br /&gt;
2.	Les &lt;strong&gt;DSN syst&amp;#232;me&lt;/strong&gt; qui sont accessibles &amp;#224; tous les utilisateurs d&amp;#8217;un m&amp;#234;me syst&amp;#232;me ou connect&amp;#233;s au syst&amp;#232;me&lt;/p&gt;

&lt;p&gt;Comment faire ?&lt;/p&gt;

&lt;p&gt;Il faut rechercher dans le panneau de contr&amp;#244;le le lien vers un utilitaire appel&amp;#233; &amp;#171; ODBC Manager &amp;#187; ou bien &amp;#171; Source de donn&amp;#233;es ODBC &amp;#187;. On le lance et on obtient une fen&amp;#234;tre avec diff&amp;#233;rents onglets. On s&amp;#233;lectionne &quot;Source de donn&amp;#233;es syst&amp;#232;me&quot;.&lt;/p&gt;


&lt;p&gt;Vous trouverez en [14] un tutoriel tr&amp;#232;s bien fait qui vous expliquera la suite.&lt;/p&gt;

&lt;p&gt;C&amp;#244;t&amp;#233; code rien de tr&amp;#232;s compliqu&amp;#233;, vous ouvrez une connexion avec &lt;em&gt;OdbcConnection &lt;/em&gt;et cr&amp;#233;ez une cha&amp;#238;ne de connexion indiquant juste le nom du DSN avec le mot clef DSN.&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;&lt;strong&gt;Utiliser une cha&amp;#238;ne fournie par l'utilisateur&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Il peut arriver que la cha&amp;#238;ne doive &amp;#234;tre construite dynamiquement ou bien construite &amp;#224; partir d&amp;#8217;informations saisies par l&amp;#8217;utilisateur. Dans ce dernier cas, c&amp;#8217;est une assez mauvaise id&amp;#233;e de le laisser saisir la cha&amp;#238;ne elle-m&amp;#234;me.&lt;/p&gt;

&lt;p&gt;Il est plut&amp;#244;t recommand&amp;#233; d&amp;#8217;utiliser une des impl&amp;#233;mentations de la classe &lt;em&gt;DBConnectionStringBuilder &lt;/em&gt;pour construire de fa&amp;#231;on s&amp;#233;curis&amp;#233;e une cha&amp;#238;ne de connexion. Par exemple pour un fournisseur SQL Server:&lt;/p&gt;

&lt;pre class=&quot;csharpcode&quot;&gt;
SqlConnectionStringBuilder builder = &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; SqlConnectionStringBuilder();
builder.IntegratedSecurity = &lt;span class=&quot;kwrd&quot;&gt;false&lt;/span&gt;;

&lt;span class=&quot;kwrd&quot;&gt;string&lt;/span&gt; maChaine = builder.ConnectionString;
&lt;/pre&gt;

&lt;p&gt;En standard on dispose des impl&amp;#233;mentations suivantes:&lt;br /&gt;
1.	SqlConnexionStringBuilder&lt;br /&gt;
2.	OracleConnexionStringBuilder&lt;br /&gt;
3.	OdbcConnexionStringBuilder&lt;br /&gt;
4.	OleDbConnexionStringBuilder&lt;/p&gt;

&lt;p&gt;La classe de base &lt;em&gt;DBConnexionStringBuilder &lt;/em&gt;vous permettra de fournir votre impl&amp;#233;mentation pour d&amp;#8217;autres cas.&lt;br /&gt;
Cette classe est &amp;#233;galement int&amp;#233;ressante si vous souhaitez analyser le contenu d&amp;#8217;une cha&amp;#238;ne de connexion. &lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;&lt;strong&gt;Comment construire une cha&amp;#238;ne de connexion&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;On a d&amp;#233;j&amp;#224; vu trois proc&amp;#233;d&amp;#233;s :&lt;br /&gt;
1.	L&amp;#8217;&amp;#233;crire directement &amp;#224; la main&lt;br /&gt;
2.	Construire un fichier udl et y lire la cha&amp;#238;ne r&amp;#233;sultante&lt;br /&gt;
3.	Utiliser une classe d&amp;#233;riv&amp;#233;e de DBConnexionStringBuilder&lt;/p&gt;

&lt;p&gt;On peut aussi trouver des exemples de cha&amp;#238;nes de connexion toutes faites ici :&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.connectionstrings.com&quot;&gt;&lt;a href=&quot;http://www.connectionstrings.com&quot;&gt;http://www.connectionstrings.com&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Mais aussi ici :&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://connectionstringexamples.com&quot;&gt;&lt;a href=&quot;http://connectionstringexamples.com&quot;&gt;http://connectionstringexamples.com&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vous y trouverez des centaines d&amp;#8217;exemples de cha&amp;#238;nes de connexion pour de nombreuses bases de donn&amp;#233;es.&lt;br /&gt;
Retenez au moins ceci :&lt;/p&gt;

&lt;p&gt;&amp;#8226;	Les noms ne sont pas sensibles &amp;#224; la casse (mais les valeurs &amp;#233;ventuellement, exemple les mots de passe)&lt;br /&gt;
&amp;#8226;	Les valeurs ne sont pas typ&amp;#233;es&lt;br /&gt;
&amp;#8226;	Si une m&amp;#234;me paire nom=valeur  appara&amp;#238;t plusieurs fois, seule la derni&amp;#232;re sera prise en compte&lt;br /&gt;
&amp;#8226;	Mais : si le mot clef PROVIDER appara&amp;#238;t plusieurs fois, c&amp;#8217;est le premier qui est pris en compte !!!!&lt;br /&gt;
&amp;#8226;	Les valeurs true ou false peuvent aussi s&amp;#8217;&amp;#233;crire yes ou no&lt;/p&gt;

&lt;p&gt;Vous trouverez plus d&amp;#8217;informations ici :&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.connectionstrings.com/Articles/Show/important-rules-for-connection-strings&quot;&gt;&lt;a href=&quot;http://www.connectionstrings.com/Articles/Show/important-rules-for-connection-strings&quot;&gt;http://www.connectionstrings.com/Articles/Show/important-rules-for-connection-strings&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;&lt;strong&gt;On trouve quoi dans une cha&amp;#238;ne de connexion&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A ma connaissance il n&amp;#8217;existe pas de norme particuli&amp;#232;re, chaque conteneur de donn&amp;#233;es y place ce qu&amp;#8217;il souhaite. Mais on retrouve malgr&amp;#233; tout une certaine syst&amp;#233;matique. &lt;/p&gt;

&lt;p&gt;L&amp;#8217;article qui suit liste la plupart des param&amp;#232;tres que l&amp;#8217;on peut rencontrer dans une cha&amp;#238;ne de connexion avec leurs valeurs par d&amp;#233;faut :&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.connectionstrings.com/Articles/Show/all-sql-server-connection-string-keywords&quot;&gt;&lt;a href=&quot;http://www.connectionstrings.com/Articles/Show/all-sql-server-connection-string-keywords&quot;&gt;http://www.connectionstrings.com/Articles/Show/all-sql-server-connection-string-keywords&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Comme vous le constatez, il y a beaucoup de synonyme.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;INITIAL CATOLOG&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;On rencontre aussi DATABASE. D&amp;#233;signe la base de donn&amp;#233;es associ&amp;#233;e &amp;#224; la connexion.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DATA SOURCE&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Ou aussi SERVER et plein d&amp;#8217;autres d&amp;#8217;ailleurs !&lt;/p&gt;

&lt;p&gt;Nom ou adresse r&amp;#233;seau de l&amp;#8217;instance de la base de donn&amp;#233;es &amp;#224; laquelle se connecter.&lt;/p&gt;

&lt;p&gt;Ce que j&amp;#8217;ai appris r&amp;#233;cemment est que l&amp;#8217;on peut y passer le nom du protocole de communication utilis&amp;#233; :&lt;/p&gt;

&lt;p&gt;DATASOURCE=np :&lt;/p&gt;&lt;serveur&gt;&lt;br /&gt;
&lt;br /&gt;
Pour les canaux nomm&amp;#233;s (named pipe).&lt;br /&gt;
&lt;br /&gt;
Mais aussi un num&amp;#233;ro de port si celui par d&amp;#233;faut ne convient pas :&lt;br /&gt;
&lt;br /&gt;
DATASOURCE=tcp :&lt;serveur&gt;,1234&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;PERSIST SECURITY INFO&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
Ce param&amp;#232;tre prend true ou false. La valeur par d&amp;#233;faut est false.&lt;br /&gt;
&lt;br /&gt;
D&amp;#8217;apr&amp;#232;s la documentation cette valeur indique que les informations de s&amp;#233;curit&amp;#233; telles le mot de passe, sont retourn&amp;#233;es dans le cadre de la connexion si celle-ci est ouverte ou a &amp;#233;t&amp;#233; ouverte &amp;#224; un moment donn&amp;#233;.&lt;br /&gt;
&lt;br /&gt;
Personnellement ce genre de d&amp;#233;finition ne me semble pas bien claire. Je ne vois pas bien ce que cela impacte pour moi et encore moins dans quels cas je dois choisir une valeur plut&amp;#244;t qu&amp;#8217;une autre. &lt;br /&gt;
&lt;br /&gt;
Comme souvent, un petit essai clarifie les choses :

&lt;pre class=&quot;csharpcode&quot;&gt;
&lt;span class=&quot;kwrd&quot;&gt;using&lt;/span&gt; (SqlConnection connnexion = &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; SqlConnection(&lt;span class=&quot;str&quot;&gt;&quot;Persist Security Info=false;Data Source=.;Initial Catalog=Northwind;Uid=IsgUser;Pwd=ISGuser!&quot;&lt;/span&gt;))
{
    &lt;span class=&quot;kwrd&quot;&gt;string&lt;/span&gt; avant = connnexion.ConnectionString;
    connnexion.Open();
    &lt;span class=&quot;kwrd&quot;&gt;string&lt;/span&gt; apres = connnexion.ConnectionString;

    &lt;span class=&quot;kwrd&quot;&gt;using&lt;/span&gt; (SqlCommand commande = connnexion.CreateCommand())
    {
        commande.CommandText = &lt;span class=&quot;str&quot;&gt;&quot;select * from Customers&quot;&lt;/span&gt;;
        &lt;span class=&quot;kwrd&quot;&gt;using&lt;/span&gt; (SqlDataReader reader = commande.ExecuteReader(CommandBehavior.CloseConnection))
        {
            &lt;span class=&quot;kwrd&quot;&gt;int&lt;/span&gt; ordinal = reader.GetOrdinal(&lt;span class=&quot;str&quot;&gt;&quot;CompanyName&quot;&lt;/span&gt;);

            &lt;span class=&quot;kwrd&quot;&gt;while&lt;/span&gt; (reader.Read())
            {
                Console.WriteLine(reader.GetString(ordinal));
            }
        }
    }
}
&lt;/pre&gt;

&lt;p&gt;Le code interroge la base &lt;strong&gt;NorthWind &lt;/strong&gt;et lit le contenu d&amp;#8217;une table. Notez la valeur explicitement mise &amp;#224; false du param&amp;#232;tre PERSIST SECURITY INFO dans la cha&amp;#238;ne de connexion.&lt;/p&gt;

&lt;p&gt;Nous ne nous int&amp;#233;ressons qu&amp;#8217;aux deux variables &lt;em&gt;avant &lt;/em&gt;et &lt;em&gt;apres &lt;/em&gt;que l&amp;#8217;on visualise ainsi :&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://www.dotnetguru2.org/media/18-07-2009 13-30-49.png&quot; border=&quot;0&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Effectivement ce n&amp;#8217;est pas bien difficile de comprendre PERSIST SECURITY INFO.&lt;/p&gt;

&lt;p&gt;La cha&amp;#238;ne de connexion compl&amp;#232;te, avec les credentials, est n&amp;#233;cessaire pour cr&amp;#233;er le pool de connexion et se connecter &amp;#224; la source de donn&amp;#233;es (ce que fait la m&amp;#233;thode Open).&lt;/p&gt;

&lt;p&gt;Par contre une fois la connexion &amp;#233;tablie, les parties sensibles du credential sont supprim&amp;#233;es. Il devient possible de passer la connexion &amp;#224; une application qui n&amp;#8217;est pas une application de confiance puisqu&amp;#8217;elle ne pourra pas r&amp;#233;utiliser la valeur de la propri&amp;#233;t&amp;#233; &lt;em&gt;ConnectionString &lt;/em&gt;pour r&amp;#233;cup&amp;#233;rer vos credentials.&lt;/p&gt;

&lt;p&gt;La conclusion de tout cela est que l&amp;#8217;on n&amp;#8217;a que rarement l&amp;#8217;occasion de mettre &lt;em&gt;true &lt;/em&gt;et si vous souhaitez loguer la cha&amp;#238;ne de connexion, mieux vaut donc &lt;em&gt;apres &lt;/em&gt;que &lt;em&gt;avant&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;INTEGRATED SECURITY&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Egalement appel&amp;#233;e &amp;#171; &lt;em&gt;trusted connection&lt;/em&gt; &amp;#187;.&lt;/p&gt;

&lt;p&gt;Voici les valeurs possibles de cette propri&amp;#233;t&amp;#233; :&lt;/p&gt;

&lt;p&gt;&amp;#8226;	SSPI (Security Support Provided Interface)&lt;br /&gt;
&amp;#8226;	true &lt;br /&gt;
&amp;#8226;	false qui est aussi la valeur par d&amp;#233;faut&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;True &lt;/strong&gt;indique que l&amp;#8217;on se connecte avec les credentials fournis par le compte Windows courant.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;False &lt;/strong&gt;indique que la cha&amp;#238;ne de connexion doit fournir des credentials (param&amp;#232;tres USER ID et PWD).&lt;/p&gt;

&lt;p&gt;Et SSPI me direz vous ?&lt;/p&gt;

&lt;p&gt;J&amp;#8217;ai longtemps cru que cette valeur &amp;#233;tait synonyme de true, mais en fait ce n&amp;#8217;est pas toujours le cas comme je l&amp;#8217;ai d&amp;#233;couvert en lisant un article du blog &amp;#171; La voie du code&amp;#171;  [9].&lt;/p&gt;

&lt;p&gt;SSPI est une API Microsoft destin&amp;#233;e &amp;#224; effectuer un certain nombre d&amp;#8217;op&amp;#233;rations li&amp;#233;es &amp;#224; la s&amp;#233;curit&amp;#233; comme par exemple l&amp;#8217;authentification [10]. SSPI permet donc de disposer d&amp;#8217;une interface commune pour acc&amp;#233;der &amp;#224; des protocoles tels Kerberos ou NTLM.&lt;/p&gt;

&lt;p&gt;Par cons&amp;#233;quent l&amp;#8217;option SSPI ne fonctionnera que si votre protocole r&amp;#233;seau utilise SSPI. &lt;br /&gt;
Parmi les exceptions se trouvent justement les canaux nomm&amp;#233;s (named pipes). Dans ce cas il faut donner true comme valeur d&amp;#8217;INTEGRATED SECURITY.&lt;/p&gt;

&lt;p&gt;Si vous &amp;#234;tes amen&amp;#233;s &amp;#224; vous servir des canaux nomm&amp;#233;s dans une application ASP.NET lisez l&amp;#8217;article en [11].&lt;br /&gt;
Si vous souhaitez en savoir plus sur les protocoles r&amp;#233;seaux accessibles &amp;#224; SQL lisez [12] et [13].&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;&lt;strong&gt;SqlBulkCopy&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Cette classe apparue avec .NET 2.0 permet de charger en bloc une table SQL Server avec des donn&amp;#233;es provenant d&amp;#8217;une autre source, pas n&amp;#233;cessairement SQL Server. Il suffit de pouvoir les lire dans un &lt;em&gt;DataSet &lt;/em&gt;ou bien avec une instance d&amp;#8217;&lt;em&gt;IDataReader&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Cette classe fonctionne un peu comme l&amp;#8217;utilitaire en ligne bcp fournit avec SQL Server.&lt;br /&gt;
Les performances sont bien meilleures qu&amp;#8217;avec des INSERT, mais on perd les logs.&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;&lt;strong&gt;Sp&amp;#233;cial sql express&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;SQL Express a diverses particularit&amp;#233;s et notamment la notion d&amp;#8217;interface utilisateur (user instance) utilis&amp;#233;e par les projets se servant de base de donn&amp;#233;es locale. User instance est un process sp&amp;#233;cifique &amp;#224; SQL Express qui peut &amp;#234;tre d&amp;#233;marr&amp;#233; par votre application au cours de son ex&amp;#233;cution. Du point de vue du code, tout se passe comme si vous disposiez d&amp;#8217;une base de donn&amp;#233;es embarqu&amp;#233;e.&lt;/p&gt;

&lt;p&gt;Voici deux articles qui vous diront tout &amp;#224; ce sujet :&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://msdn.microsoft.com/fr-fr/library/bb264564(SQL.90).aspx&quot;&gt;&lt;a href=&quot;http://msdn.microsoft.com/fr-fr/library/bb264564(SQL.90).aspx&quot;&gt;http://msdn.microsoft.com/fr-fr/library/bb264564(SQL.90).aspx&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Et en anglais un blog vraiment int&amp;#233;ressant o&amp;#249; vous apprendrez &amp;#224; vous connecter &amp;#224; une user instance via management studio:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://blogs.msdn.com/sqlexpress/archive/2006/11/22/connecting-to-sql-express-user-instances-in-management-studio.aspx&quot;&gt;&lt;a href=&quot;http://blogs.msdn.com/sqlexpress/archive/2006/11/22/connecting-to-sql-express-user-instances-in-management-studio.aspx&quot;&gt;http://blogs.msdn.com/sqlexpress/archive/2006/11/22/connecting-to-sql-express-user-instances-in-management-studio.aspx&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;&lt;strong&gt;Bibliographie&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;[1] Comment faire pour utiliser des fichiers de liaison de donn&amp;#233;es avec l'objet OleDbConnection dans Visual C# .NET&lt;br /&gt;
&lt;a href=&quot;http://support.microsoft.com/kb/308426&quot;&gt;&lt;a href=&quot;http://support.microsoft.com/kb/308426&quot;&gt;http://support.microsoft.com/kb/308426&lt;/a&gt;&lt;/a&gt;&lt;br /&gt;
[2] ADO.NET and UDL&lt;br /&gt;
&lt;a href=&quot;http://www.codeproject.com/KB/database/ADONETUDL.aspx&quot;&gt;&lt;a href=&quot;http://www.codeproject.com/KB/database/ADONETUDL.aspx&quot;&gt;http://www.codeproject.com/KB/database/ADONETUDL.aspx&lt;/a&gt;&lt;/a&gt;[3] Les attaques par canonicalisation 1/2&lt;br /&gt;
&lt;a href=&quot;http://www.dotnetguru2.org/amethyste/index.php?p=103&amp;amp;more=1&amp;amp;c=1&amp;amp;tb=1&amp;amp;pb=1&quot;&gt;&lt;a href=&quot;http://www.dotnetguru2.org/amethyste/index.php?p=103&amp;amp;more=1&amp;amp;c=1&amp;amp;tb=1&amp;amp;pb=1&quot;&gt;http://www.dotnetguru2.org/amethyste/index.php?p=103&amp;amp;more=1&amp;amp;c=1&amp;amp;tb=1&amp;amp;pb=1&lt;/a&gt;&lt;/a&gt;&lt;br /&gt;
[4] Les attaques par canonicalisation 2/2&lt;br /&gt;
&lt;a href=&quot;http://www.dotnetguru2.org/amethyste/index.php?p=104&amp;amp;more=1&amp;amp;c=1&amp;amp;tb=1&amp;amp;pb=1&quot;&gt;&lt;a href=&quot;http://www.dotnetguru2.org/amethyste/index.php?p=104&amp;amp;more=1&amp;amp;c=1&amp;amp;tb=1&amp;amp;pb=1&quot;&gt;http://www.dotnetguru2.org/amethyste/index.php?p=104&amp;amp;more=1&amp;amp;c=1&amp;amp;tb=1&amp;amp;pb=1&lt;/a&gt;&lt;/a&gt;&lt;br /&gt;
[5] Proc&amp;#233;dure : Stocker une cha&amp;#238;ne de connexion crypt&amp;#233;e dans le Registre&lt;br /&gt;
&lt;a href=&quot;http://msdn.microsoft.com/fr-fr/library/aa302406.aspx&quot;&gt;&lt;a href=&quot;http://msdn.microsoft.com/fr-fr/library/aa302406.aspx&quot;&gt;http://msdn.microsoft.com/fr-fr/library/aa302406.aspx&lt;/a&gt;&lt;/a&gt;&lt;br /&gt;
[6] Outil ASP.NET IIS Registration (Aspnet_regiis.exe)&lt;br /&gt;
&lt;a href=&quot;http://msdn.microsoft.com/fr-fr/library/k6h9cz8h(VS.80).aspx&quot;&gt;&lt;a href=&quot;http://msdn.microsoft.com/fr-fr/library/k6h9cz8h(VS.80).aspx&quot;&gt;http://msdn.microsoft.com/fr-fr/library/k6h9cz8h(VS.80).aspx&lt;/a&gt;&lt;/a&gt;&lt;br /&gt;
[7] Crypter une section du fichier de configuration avec aspnet_regiis&lt;br /&gt;
&lt;a href=&quot;http://blogs.developpeur.org/sanzio/archive/2008/04/14/crypter-une-section-du-fichier-de-configuration-avec-aspnet-regiis.aspx&quot;&gt;&lt;a href=&quot;http://blogs.developpeur.org/sanzio/archive/2008/04/14/crypter-une-section-du-fichier-de-configuration-avec-aspnet-regiis.aspx&quot;&gt;http://blogs.developpeur.org/sanzio/archive/2008/04/14/crypter-une-section-du-fichier-de-configuration-avec-aspnet-regiis.aspx&lt;/a&gt;&lt;/a&gt;&lt;br /&gt;
[8] Secure ADO.NET connections&lt;br /&gt;
&lt;a href=&quot;http://msdn.microsoft.com/en-us/library/89211k9b(VS.71).aspx&quot;&gt;&lt;a href=&quot;http://msdn.microsoft.com/en-us/library/89211k9b(VS.71).aspx&quot;&gt;http://msdn.microsoft.com/en-us/library/89211k9b(VS.71).aspx&lt;/a&gt;&lt;/a&gt;&lt;br /&gt;
[9] Le vrai sens de Integrated Security=SSPI&lt;br /&gt;
&lt;a href=&quot;http://www.doanvanbien.com/voieducode/archives/2006/09/13/21&quot;&gt;&lt;a href=&quot;http://www.doanvanbien.com/voieducode/archives/2006/09/13/21&quot;&gt;http://www.doanvanbien.com/voieducode/archives/2006/09/13/21&lt;/a&gt;&lt;/a&gt;&lt;br /&gt;
[10] SSPI Reference sur MSDN&lt;br /&gt;
&lt;a href=&quot;http://msdn.microsoft.com/en-us/library/aa380493(VS.85).aspx&quot;&gt;&lt;a href=&quot;http://msdn.microsoft.com/en-us/library/aa380493(VS.85).aspx&quot;&gt;http://msdn.microsoft.com/en-us/library/aa380493(VS.85).aspx&lt;/a&gt;&lt;/a&gt;&lt;br /&gt;
[11] Les canaux nomm&amp;#233;s ne fonctionnent pas quand le processus de traitement s'ex&amp;#233;cute sous un compte ASPNET&lt;br /&gt;
&lt;a href=&quot;http://support.microsoft.com/Default.aspx?id=315159&quot;&gt;&lt;a href=&quot;http://support.microsoft.com/Default.aspx?id=315159&quot;&gt;http://support.microsoft.com/Default.aspx?id=315159&lt;/a&gt;&lt;/a&gt;&lt;br /&gt;
[12] [SQL] Force the protocol (TCP, Named Pipes, etc.) in your connection string&lt;br /&gt;
&lt;a href=&quot;http://weblogs.asp.net/jgalloway/archive/2007/02/24/sql-force-the-protocol-tcp-named-pipes-etc-in-your-connection-string.aspx&quot;&gt;&lt;a href=&quot;http://weblogs.asp.net/jgalloway/archive/2007/02/24/sql-force-the-protocol-tcp-named-pipes-etc-in-your-connection-string.aspx&quot;&gt;http://weblogs.asp.net/jgalloway/archive/2007/02/24/sql-force-the-protocol-tcp-named-pipes-etc-in-your-connection-string.aspx&lt;/a&gt;&lt;/a&gt;&lt;br /&gt;
[13] Choix d&amp;#8217;un protocol r&amp;#233;seau&lt;br /&gt;
&lt;a href=&quot;http://msdn.microsoft.com/fr-fr/library/ms187892.aspx&quot;&gt;&lt;a href=&quot;http://msdn.microsoft.com/fr-fr/library/ms187892.aspx&quot;&gt;http://msdn.microsoft.com/fr-fr/library/ms187892.aspx&lt;/a&gt;&lt;/a&gt;&lt;br /&gt;
[14] Cr&amp;#233;ation d&amp;#8217;un DSN ODBC&lt;br /&gt;
&lt;a href=&quot;http://www.commentcamarche.net/contents/odbc/odbcdsn.php3&quot;&gt;&lt;a href=&quot;http://www.commentcamarche.net/contents/odbc/odbcdsn.php3&quot;&gt;http://www.commentcamarche.net/contents/odbc/odbcdsn.php3&lt;/a&gt;&lt;/a&gt;&lt;/serveur&gt;&lt;/serveur&gt;&lt;/p&gt;&lt;div class=&quot;item_footer&quot;&gt;&lt;p&gt;&lt;small&gt;&lt;a href=&quot;http://www.dotnetguru2.org/amethyste/index.php/2009/07/18/les_chaines_de_connexion&quot;&gt;Original post&lt;/a&gt; blogged on &lt;a href=&quot;http://b2evolution.net/&quot;&gt;b2evolution&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;&lt;/div&gt;</description>
			<content:encoded><![CDATA[<p>Un article sans autre pr&#233;tention que rassembler un certain nombre d&#8217;informations en g&#233;n&#233;ral assez &#233;parses sur les cha&#238;nes de connexion.<br />
Il n&#8217;y a pas d&#8217;ordre particulier, juste des chapitres qui se suivent.</p>

<hr>

<p><strong>un peu d'orthographe</strong></p>

<p>&#8226;	En anglais on &#233;crit : conne<strong>ct</strong>ion<br />
&#8226;	Par contre en fran&#231;ais : conne<strong>x</strong>ion, avec un x.</p>

<p>Allez donc relire votre doc et vos commentaires&#8230;</p>

<hr>

<p><strong>Sauver une cha&#238;ne dans une application .net</strong></p>

<p>Examinons diff&#233;rents conteneurs, sans pr&#233;tendre &#234;tre exhaustif.</p>

<p><strong>Le code</strong></p>

<p>Cette possibilit&#233; est assez rare car dans la majorit&#233; des cas il s&#8217;agit plut&#244;t d&#8217;une faute de codage. Avant de l&#8217;adopter, &#233;valuez en les avantages et les inconv&#233;nients avec soin.</p>

<p><strong>Le fichier de configuration</strong></p>


<p>Depuis .NET 2.0 est apparue la structure &lt;connectionStrings>.<br />
Par exemple :</p>

<pre class="csharpcode">
<span class="kwrd">&lt;</span><span class="html">connectionStrings</span><span class="kwrd">&gt;</span>
  <span class="kwrd">&lt;</span><span class="html">add</span> <span class="attr">name</span><span class="kwrd">="nomChaineConnexion"</span> <span class="attr">connectionString</span><span class="kwrd">="XXXXXXXX"</span><span class="kwrd">/&gt;</span>
<span class="kwrd">&lt;/</span><span class="html">connectionStrings</span><span class="kwrd">&gt;</span>
</pre>

<p><b>name</b>: Nom du conteneur<br />
<b>connectionString</b>: Cha&#238;ne de connexion</p>

<p>C&#244;t&#233; code, la r&#233;cup&#233;ration de la cha&#238;ne se fait ainsi :</p>

<pre class="csharpcode">
ConnectionStringSettings chaine = ConfigurationManager.ConnectionStrings[<span class="str">"nomChaineConnexion"</span>];</pre>

<p>Le nom du conteneur peut faire l&#8217;objet d&#8217;une entr&#233;e dans la section &lt;appSettings >  que l&#8217;on peut alors relire en interrogeant le dictionnaire <em>ConfigurationManager.AppSettings</em>.</p>

<p>La classe <em>ConnectionStringSettings </em>propose diverses propri&#233;t&#233;s, mais celle qui vous int&#233;ressera le plus est <em>ConnectionString </em>qui est du type String et retourne biens s&#251;r notre cha&#238;ne.</p>

<p><strong>Qu'en est t'il c&#244;t&#233; s&#233;curit&#233;?</strong></p>

<p>Par d&#233;faut ASP.NET est configur&#233; pour ne jamais t&#233;l&#233;charger le fichier web.config. On n&#8217;a donc pas de risque de le voir appara&#238;tre en navigant sur le site.</p>

<p>Le r&#233;glage est fait dans le fichier <strong>web.config</strong> par d&#233;faut situ&#233; dans :</p>

<p>%SystemRoot%\ Microsoft.NET\Framework\v2.0.50727\CONFIG</p>

<blockquote><p>Ce fichier est apparu avec .NET 2.0, le param&#233;trage se trouve dans machine.config dans les versions ant&#233;rieures de .NET.</p></blockquote>

<p>Ce dernier fichier se trouvant hors r&#233;pertoire virtuel, il est donc consid&#233;r&#233; comme raisonnablement s&#251;r pour une application Web, d&#8217;autant plus que des ACL sont pos&#233;es sur ce fichier lors de l&#8217;installation de .NET.</p>

<p>La protection contre les attaques ext&#233;rieures est donc s&#251;re. </p>

<p>On peut encore augmenter la s&#233;curit&#233; en cryptant la cha&#238;ne de connexion &#224; l&#8217;aide de l&#8217;outil aspnet_regiis.exe livr&#233; avec ASP.NET.<br />
Faisons ensemble une petite d&#233;monstration, mais sinon reportez vous &#224; la r&#233;f&#233;rence [6] pour plus de d&#233;tails.<br />
Par exemple (mais d&#8217;autres syntaxes existent):</p>


<p>aspnet_regiis -pef "connectionStrings" "C:\Projets\...."</p>

<p>Notez que l&#8217;un des param&#232;tres est la section que l&#8217;on souhaite crypter, on n&#8217;est donc pas limit&#233; aux cha&#238;nes de connexion.<br />
Le r&#233;sultat ressemble &#224; ceci :</p>

<pre class="csharpcode">
<span class="kwrd">&lt;</span><span class="html">connectionStrings</span> <span class="attr">configProtectionProvider</span><span class="kwrd">="RsaProtectedConfigurationProvider"</span><span class="kwrd">&gt;</span>
    <span class="kwrd">&lt;</span><span class="html">EncryptedData</span> <span class="attr">Type</span><span class="kwrd">="http://www.w3.org/2001/04/xmlenc#Element"</span>
      <span class="attr">xmlns</span><span class="kwrd">="http://www.w3.org/2001/04/xmlenc#"</span><span class="kwrd">&gt;</span>
      <span class="kwrd">&lt;</span><span class="html">EncryptionMethod</span> <span class="attr">Algorithm</span><span class="kwrd">="http://www.w3.org/2001/04/xmlenc#tripledes-cbc"</span> <span class="kwrd">/&gt;</span>
      <span class="kwrd">&lt;</span><span class="html">KeyInfo</span> <span class="attr">xmlns</span><span class="kwrd">="http://www.w3.org/2000/09/xmldsig#"</span><span class="kwrd">&gt;</span>
        <span class="kwrd">&lt;</span><span class="html">EncryptedKey</span> <span class="attr">xmlns</span><span class="kwrd">="http://www.w3.org/2001/04/xmlenc#"</span><span class="kwrd">&gt;</span>
          <span class="kwrd">&lt;</span><span class="html">EncryptionMethod</span> <span class="attr">Algorithm</span><span class="kwrd">="http://www.w3.org/2001/04/xmlenc#rsa-1_5"</span> <span class="kwrd">/&gt;</span>
          <span class="kwrd">&lt;</span><span class="html">KeyInfo</span> <span class="attr">xmlns</span><span class="kwrd">="http://www.w3.org/2000/09/xmldsig#"</span><span class="kwrd">&gt;</span>
            <span class="kwrd">&lt;</span><span class="html">KeyName</span><span class="kwrd">&gt;</span>Rsa Key<span class="kwrd">&lt;/</span><span class="html">KeyName</span><span class="kwrd">&gt;</span>
          <span class="kwrd">&lt;/</span><span class="html">KeyInfo</span><span class="kwrd">&gt;</span>
          <span class="kwrd">&lt;</span><span class="html">CipherData</span><span class="kwrd">&gt;</span>
            <span class="kwrd">&lt;</span><span class="html">CipherValue</span><span class="kwrd">&gt;</span>BkzayktAAs&#8230;.BDkjEuG3ZVRs/M=<span class="kwrd">&lt;/</span><span class="html">CipherValue</span><span class="kwrd">&gt;</span>
          <span class="kwrd">&lt;/</span><span class="html">CipherData</span><span class="kwrd">&gt;</span>
        <span class="kwrd">&lt;/</span><span class="html">EncryptedKey</span><span class="kwrd">&gt;</span>
      <span class="kwrd">&lt;/</span><span class="html">KeyInfo</span><span class="kwrd">&gt;</span>
      <span class="kwrd">&lt;</span><span class="html">CipherData</span><span class="kwrd">&gt;</span>
        <span class="kwrd">&lt;</span><span class="html">CipherValue</span><span class="kwrd">&gt;</span>UFds9Ssuc6+gHRwt3G&#8230;bWqQS31ha<span class="kwrd">&lt;/</span><span class="html">CipherValue</span><span class="kwrd">&gt;</span>
      <span class="kwrd">&lt;/</span><span class="html">CipherData</span><span class="kwrd">&gt;</span>
    <span class="kwrd">&lt;/</span><span class="html">EncryptedData</span><span class="kwrd">&gt;</span>
  <span class="kwrd">&lt;/</span><span class="html">connectionStrings</span><span class="kwrd">&gt;</span>
</pre>

<p>Notez plusieurs choses importantes :</p>

<p>&#8226;	C&#8217;est transparent pour votre code<br />
&#8226;	L&#8217;op&#233;ration est r&#233;versible<br />
&#8226;	Le r&#233;sultat du cryptage est, par d&#233;faut, sp&#233;cifique &#224; la machine sur lequel il a &#233;t&#233; effectu&#233;, mais il est possible de mettre en place un conteneur RSA particulier comme expliqu&#233; en [7]</p>

<p>A ma connaissance cet outil ne s&#8217;applique qu&#8217;au fichier web .config, du moins je ne suis pas parvenu &#224; l&#8217;appliquer &#224; un fichier de configuration d&#8217;une application console. Si quelqu&#8217;un sait faire sans avoir &#224; renommer le fichier&#8230;</p>

<p><strong>Fichier udl (universal data link)</strong></p>

<p>Pour cr&#233;er un fichier udl :<br />
&#8226;	Naviguez jusqu&#8217;au r&#233;pertoire o&#249; vous souhaitez le d&#233;poser<br />
&#8226;	Cr&#233;ez un fichier texte avec l&#8217;extension .udl<br />
&#8226;	Double cliquez dessus. Une fen&#234;tre suivante s&#8217;ouvre<br />
&#8226;	Remplissez la boite de dialogue. </p>

<p>Une fois termin&#233;, le fichier contiendra la cha&#238;ne de connexion compl&#232;te.</p>

<p>Au sujet du choix du fournisseur, notez que seul OLE DB est support&#233; par ADO.NET avec les fichiers udl. Mais c&#8217;est un moyen que j&#8217;aime bien utiliser pour construire une cha&#238;ne de connexion.</p>

<p>C&#244;t&#233; code maintenant. Disons que votre fichier se nomme monFichierAMoi.udl.</p>


<pre class="csharpcode">
OleDbConnection myConnection = <span class="kwrd">new</span> OleDbConnection(<span class="str">"File Name = c:\\monFichierAMoi.udl"</span>);</pre>

<p>Vous trouverez plus d&#8217;infos en [1] et [2].</p>

<p>C&#244;t&#233; s&#233;curit&#233;?</p>

<p>Ne surtout pas placer le fichier udl dans le r&#233;pertoire virtuel car il ne sera pas prot&#233;g&#233; du t&#233;l&#233;chargement. Pour &#233;viter de possibles bugs de canonicalisation [3], [4], il est m&#234;me pr&#233;f&#233;rable de le disposer dans un volume logique diff&#233;rent de celui du site.</p>

<p>Comme tout fichier critique, il doit &#234;tre prot&#233;g&#233; par des ACL adapt&#233;s. A ce titre l&#8217;acc&#232;s au fichier udl peut &#234;tre mieux prot&#233;g&#233; que celui de web.config car on peut le rendre accessible &#224; nettement moins de comptes. Il y aura au moins MachineName\ASPNET qui n&#8217;a besoin que d&#8217;un acc&#232;s en lecture.</p>

<blockquote><p>Dans la mesure o&#249; le fichier udl peut &#234;tre modifi&#233; &#224; l&#8217;insu de l&#8217;application, celui-ci n&#8217;est pas mis en cache, mais lu &#224; chaque appel. Cela peut avoir un impact sur les performances</p></blockquote>

<p>Il n&#8217;est pas possible d&#8217;encrypter les fichiers udl.</p>

<p><strong>Fichier personnalis&#233;</strong></p>

<p>Cette option n&#8217;est int&#233;ressante que si le fichier est plac&#233; en dehors du r&#233;pertoire virtuel pour des raisons de s&#233;curit&#233;.<br />
Il doit &#234;tre prot&#233;g&#233; par des ACL restrictives et id&#233;alement plac&#233; dans un volume distinct de l&#8217;application.</p>

<p><strong>Le registre</strong></p>

<p>Pour que l&#8217;application ASP puisse y acc&#233;der, vous devrez placer la cha&#238;ne de connexion dans HKLM. Vous devrez &#233;galement :<br />
&#8226;	Prot&#233;ger la clef avec un ACL<br />
&#8226;	L&#8217;encrypter (voir [5] pour une proc&#233;dure)</p>

<p><strong>Cr&#233;er un DSN</strong></p>

<p>Un DSN (Data Source Name) est simplement un fichier avec toutes les informations pour identifier une source de donn&#233;es accessible <strong>via ODBC</strong>.</p>

<p>Il existe deux types de DSN :<br />
1.	Les <strong>DSN utilisateur</strong> qui ne sont visible que d&#8217;un utilisateur sur la machine o&#249; le DSN est d&#233;ploy&#233;<br />
2.	Les <strong>DSN syst&#232;me</strong> qui sont accessibles &#224; tous les utilisateurs d&#8217;un m&#234;me syst&#232;me ou connect&#233;s au syst&#232;me</p>

<p>Comment faire ?</p>

<p>Il faut rechercher dans le panneau de contr&#244;le le lien vers un utilitaire appel&#233; &#171; ODBC Manager &#187; ou bien &#171; Source de donn&#233;es ODBC &#187;. On le lance et on obtient une fen&#234;tre avec diff&#233;rents onglets. On s&#233;lectionne "Source de donn&#233;es syst&#232;me".</p>


<p>Vous trouverez en [14] un tutoriel tr&#232;s bien fait qui vous expliquera la suite.</p>

<p>C&#244;t&#233; code rien de tr&#232;s compliqu&#233;, vous ouvrez une connexion avec <em>OdbcConnection </em>et cr&#233;ez une cha&#238;ne de connexion indiquant juste le nom du DSN avec le mot clef DSN.</p>

<hr>

<p><strong>Utiliser une cha&#238;ne fournie par l'utilisateur</strong></p>

<p>Il peut arriver que la cha&#238;ne doive &#234;tre construite dynamiquement ou bien construite &#224; partir d&#8217;informations saisies par l&#8217;utilisateur. Dans ce dernier cas, c&#8217;est une assez mauvaise id&#233;e de le laisser saisir la cha&#238;ne elle-m&#234;me.</p>

<p>Il est plut&#244;t recommand&#233; d&#8217;utiliser une des impl&#233;mentations de la classe <em>DBConnectionStringBuilder </em>pour construire de fa&#231;on s&#233;curis&#233;e une cha&#238;ne de connexion. Par exemple pour un fournisseur SQL Server:</p>

<pre class="csharpcode">
SqlConnectionStringBuilder builder = <span class="kwrd">new</span> SqlConnectionStringBuilder();
builder.IntegratedSecurity = <span class="kwrd">false</span>;

<span class="kwrd">string</span> maChaine = builder.ConnectionString;
</pre>

<p>En standard on dispose des impl&#233;mentations suivantes:<br />
1.	SqlConnexionStringBuilder<br />
2.	OracleConnexionStringBuilder<br />
3.	OdbcConnexionStringBuilder<br />
4.	OleDbConnexionStringBuilder</p>

<p>La classe de base <em>DBConnexionStringBuilder </em>vous permettra de fournir votre impl&#233;mentation pour d&#8217;autres cas.<br />
Cette classe est &#233;galement int&#233;ressante si vous souhaitez analyser le contenu d&#8217;une cha&#238;ne de connexion. </p>

<hr>

<p><strong>Comment construire une cha&#238;ne de connexion</strong></p>

<p>On a d&#233;j&#224; vu trois proc&#233;d&#233;s :<br />
1.	L&#8217;&#233;crire directement &#224; la main<br />
2.	Construire un fichier udl et y lire la cha&#238;ne r&#233;sultante<br />
3.	Utiliser une classe d&#233;riv&#233;e de DBConnexionStringBuilder</p>

<p>On peut aussi trouver des exemples de cha&#238;nes de connexion toutes faites ici :</p>

<p><a href="http://www.connectionstrings.com"><a href="http://www.connectionstrings.com">http://www.connectionstrings.com</a></a></p>

<p>Mais aussi ici :</p>

<p><a href="http://connectionstringexamples.com"><a href="http://connectionstringexamples.com">http://connectionstringexamples.com</a></a></p>

<p>Vous y trouverez des centaines d&#8217;exemples de cha&#238;nes de connexion pour de nombreuses bases de donn&#233;es.<br />
Retenez au moins ceci :</p>

<p>&#8226;	Les noms ne sont pas sensibles &#224; la casse (mais les valeurs &#233;ventuellement, exemple les mots de passe)<br />
&#8226;	Les valeurs ne sont pas typ&#233;es<br />
&#8226;	Si une m&#234;me paire nom=valeur  appara&#238;t plusieurs fois, seule la derni&#232;re sera prise en compte<br />
&#8226;	Mais : si le mot clef PROVIDER appara&#238;t plusieurs fois, c&#8217;est le premier qui est pris en compte !!!!<br />
&#8226;	Les valeurs true ou false peuvent aussi s&#8217;&#233;crire yes ou no</p>

<p>Vous trouverez plus d&#8217;informations ici :</p>

<p><a href="http://www.connectionstrings.com/Articles/Show/important-rules-for-connection-strings"><a href="http://www.connectionstrings.com/Articles/Show/important-rules-for-connection-strings">http://www.connectionstrings.com/Articles/Show/important-rules-for-connection-strings</a></a></p>

<hr>

<p><strong>On trouve quoi dans une cha&#238;ne de connexion</strong></p>

<p>A ma connaissance il n&#8217;existe pas de norme particuli&#232;re, chaque conteneur de donn&#233;es y place ce qu&#8217;il souhaite. Mais on retrouve malgr&#233; tout une certaine syst&#233;matique. </p>

<p>L&#8217;article qui suit liste la plupart des param&#232;tres que l&#8217;on peut rencontrer dans une cha&#238;ne de connexion avec leurs valeurs par d&#233;faut :</p>

<p><a href="http://www.connectionstrings.com/Articles/Show/all-sql-server-connection-string-keywords"><a href="http://www.connectionstrings.com/Articles/Show/all-sql-server-connection-string-keywords">http://www.connectionstrings.com/Articles/Show/all-sql-server-connection-string-keywords</a></a></p>

<p>Comme vous le constatez, il y a beaucoup de synonyme.</p>

<p><strong>INITIAL CATOLOG</strong></p>

<p>On rencontre aussi DATABASE. D&#233;signe la base de donn&#233;es associ&#233;e &#224; la connexion.</p>

<p><strong>DATA SOURCE</strong></p>

<p>Ou aussi SERVER et plein d&#8217;autres d&#8217;ailleurs !</p>

<p>Nom ou adresse r&#233;seau de l&#8217;instance de la base de donn&#233;es &#224; laquelle se connecter.</p>

<p>Ce que j&#8217;ai appris r&#233;cemment est que l&#8217;on peut y passer le nom du protocole de communication utilis&#233; :</p>

<p>DATASOURCE=np :</p><serveur><br />
<br />
Pour les canaux nomm&#233;s (named pipe).<br />
<br />
Mais aussi un num&#233;ro de port si celui par d&#233;faut ne convient pas :<br />
<br />
DATASOURCE=tcp :<serveur>,1234<br />
<br />
<strong>PERSIST SECURITY INFO</strong><br />
<br />
Ce param&#232;tre prend true ou false. La valeur par d&#233;faut est false.<br />
<br />
D&#8217;apr&#232;s la documentation cette valeur indique que les informations de s&#233;curit&#233; telles le mot de passe, sont retourn&#233;es dans le cadre de la connexion si celle-ci est ouverte ou a &#233;t&#233; ouverte &#224; un moment donn&#233;.<br />
<br />
Personnellement ce genre de d&#233;finition ne me semble pas bien claire. Je ne vois pas bien ce que cela impacte pour moi et encore moins dans quels cas je dois choisir une valeur plut&#244;t qu&#8217;une autre. <br />
<br />
Comme souvent, un petit essai clarifie les choses :

<pre class="csharpcode">
<span class="kwrd">using</span> (SqlConnection connnexion = <span class="kwrd">new</span> SqlConnection(<span class="str">"Persist Security Info=false;Data Source=.;Initial Catalog=Northwind;Uid=IsgUser;Pwd=ISGuser!"</span>))
{
    <span class="kwrd">string</span> avant = connnexion.ConnectionString;
    connnexion.Open();
    <span class="kwrd">string</span> apres = connnexion.ConnectionString;

    <span class="kwrd">using</span> (SqlCommand commande = connnexion.CreateCommand())
    {
        commande.CommandText = <span class="str">"select * from Customers"</span>;
        <span class="kwrd">using</span> (SqlDataReader reader = commande.ExecuteReader(CommandBehavior.CloseConnection))
        {
            <span class="kwrd">int</span> ordinal = reader.GetOrdinal(<span class="str">"CompanyName"</span>);

            <span class="kwrd">while</span> (reader.Read())
            {
                Console.WriteLine(reader.GetString(ordinal));
            }
        }
    }
}
</pre>

<p>Le code interroge la base <strong>NorthWind </strong>et lit le contenu d&#8217;une table. Notez la valeur explicitement mise &#224; false du param&#232;tre PERSIST SECURITY INFO dans la cha&#238;ne de connexion.</p>

<p>Nous ne nous int&#233;ressons qu&#8217;aux deux variables <em>avant </em>et <em>apres </em>que l&#8217;on visualise ainsi :</p>

<p><img src="http://www.dotnetguru2.org/media/18-07-2009 13-30-49.png" border="0" alt="" /></p>

<p>Effectivement ce n&#8217;est pas bien difficile de comprendre PERSIST SECURITY INFO.</p>

<p>La cha&#238;ne de connexion compl&#232;te, avec les credentials, est n&#233;cessaire pour cr&#233;er le pool de connexion et se connecter &#224; la source de donn&#233;es (ce que fait la m&#233;thode Open).</p>

<p>Par contre une fois la connexion &#233;tablie, les parties sensibles du credential sont supprim&#233;es. Il devient possible de passer la connexion &#224; une application qui n&#8217;est pas une application de confiance puisqu&#8217;elle ne pourra pas r&#233;utiliser la valeur de la propri&#233;t&#233; <em>ConnectionString </em>pour r&#233;cup&#233;rer vos credentials.</p>

<p>La conclusion de tout cela est que l&#8217;on n&#8217;a que rarement l&#8217;occasion de mettre <em>true </em>et si vous souhaitez loguer la cha&#238;ne de connexion, mieux vaut donc <em>apres </em>que <em>avant</em>.</p>

<p><strong>INTEGRATED SECURITY</strong></p>

<p>Egalement appel&#233;e &#171; <em>trusted connection</em> &#187;.</p>

<p>Voici les valeurs possibles de cette propri&#233;t&#233; :</p>

<p>&#8226;	SSPI (Security Support Provided Interface)<br />
&#8226;	true <br />
&#8226;	false qui est aussi la valeur par d&#233;faut</p>

<p><strong>True </strong>indique que l&#8217;on se connecte avec les credentials fournis par le compte Windows courant.</p>

<p><strong>False </strong>indique que la cha&#238;ne de connexion doit fournir des credentials (param&#232;tres USER ID et PWD).</p>

<p>Et SSPI me direz vous ?</p>

<p>J&#8217;ai longtemps cru que cette valeur &#233;tait synonyme de true, mais en fait ce n&#8217;est pas toujours le cas comme je l&#8217;ai d&#233;couvert en lisant un article du blog &#171; La voie du code&#171;  [9].</p>

<p>SSPI est une API Microsoft destin&#233;e &#224; effectuer un certain nombre d&#8217;op&#233;rations li&#233;es &#224; la s&#233;curit&#233; comme par exemple l&#8217;authentification [10]. SSPI permet donc de disposer d&#8217;une interface commune pour acc&#233;der &#224; des protocoles tels Kerberos ou NTLM.</p>

<p>Par cons&#233;quent l&#8217;option SSPI ne fonctionnera que si votre protocole r&#233;seau utilise SSPI. <br />
Parmi les exceptions se trouvent justement les canaux nomm&#233;s (named pipes). Dans ce cas il faut donner true comme valeur d&#8217;INTEGRATED SECURITY.</p>

<p>Si vous &#234;tes amen&#233;s &#224; vous servir des canaux nomm&#233;s dans une application ASP.NET lisez l&#8217;article en [11].<br />
Si vous souhaitez en savoir plus sur les protocoles r&#233;seaux accessibles &#224; SQL lisez [12] et [13].</p>

<hr>

<p><strong>SqlBulkCopy</strong></p>

<p>Cette classe apparue avec .NET 2.0 permet de charger en bloc une table SQL Server avec des donn&#233;es provenant d&#8217;une autre source, pas n&#233;cessairement SQL Server. Il suffit de pouvoir les lire dans un <em>DataSet </em>ou bien avec une instance d&#8217;<em>IDataReader</em>.</p>

<p>Cette classe fonctionne un peu comme l&#8217;utilitaire en ligne bcp fournit avec SQL Server.<br />
Les performances sont bien meilleures qu&#8217;avec des INSERT, mais on perd les logs.</p>

<hr>

<p><strong>Sp&#233;cial sql express</strong></p>

<p>SQL Express a diverses particularit&#233;s et notamment la notion d&#8217;interface utilisateur (user instance) utilis&#233;e par les projets se servant de base de donn&#233;es locale. User instance est un process sp&#233;cifique &#224; SQL Express qui peut &#234;tre d&#233;marr&#233; par votre application au cours de son ex&#233;cution. Du point de vue du code, tout se passe comme si vous disposiez d&#8217;une base de donn&#233;es embarqu&#233;e.</p>

<p>Voici deux articles qui vous diront tout &#224; ce sujet :</p>

<p><a href="http://msdn.microsoft.com/fr-fr/library/bb264564(SQL.90).aspx"><a href="http://msdn.microsoft.com/fr-fr/library/bb264564(SQL.90).aspx">http://msdn.microsoft.com/fr-fr/library/bb264564(SQL.90).aspx</a></a></p>

<p>Et en anglais un blog vraiment int&#233;ressant o&#249; vous apprendrez &#224; vous connecter &#224; une user instance via management studio:</p>

<p><a href="http://blogs.msdn.com/sqlexpress/archive/2006/11/22/connecting-to-sql-express-user-instances-in-management-studio.aspx"><a href="http://blogs.msdn.com/sqlexpress/archive/2006/11/22/connecting-to-sql-express-user-instances-in-management-studio.aspx">http://blogs.msdn.com/sqlexpress/archive/2006/11/22/connecting-to-sql-express-user-instances-in-management-studio.aspx</a></a></p>

<hr>

<p><strong>Bibliographie</strong></p>

<p>[1] Comment faire pour utiliser des fichiers de liaison de donn&#233;es avec l'objet OleDbConnection dans Visual C# .NET<br />
<a href="http://support.microsoft.com/kb/308426"><a href="http://support.microsoft.com/kb/308426">http://support.microsoft.com/kb/308426</a></a><br />
[2] ADO.NET and UDL<br />
<a href="http://www.codeproject.com/KB/database/ADONETUDL.aspx"><a href="http://www.codeproject.com/KB/database/ADONETUDL.aspx">http://www.codeproject.com/KB/database/ADONETUDL.aspx</a></a>[3] Les attaques par canonicalisation 1/2<br />
<a href="http://www.dotnetguru2.org/amethyste/index.php?p=103&amp;more=1&amp;c=1&amp;tb=1&amp;pb=1"><a href="http://www.dotnetguru2.org/amethyste/index.php?p=103&amp;more=1&amp;c=1&amp;tb=1&amp;pb=1">http://www.dotnetguru2.org/amethyste/index.php?p=103&amp;more=1&amp;c=1&amp;tb=1&amp;pb=1</a></a><br />
[4] Les attaques par canonicalisation 2/2<br />
<a href="http://www.dotnetguru2.org/amethyste/index.php?p=104&amp;more=1&amp;c=1&amp;tb=1&amp;pb=1"><a href="http://www.dotnetguru2.org/amethyste/index.php?p=104&amp;more=1&amp;c=1&amp;tb=1&amp;pb=1">http://www.dotnetguru2.org/amethyste/index.php?p=104&amp;more=1&amp;c=1&amp;tb=1&amp;pb=1</a></a><br />
[5] Proc&#233;dure : Stocker une cha&#238;ne de connexion crypt&#233;e dans le Registre<br />
<a href="http://msdn.microsoft.com/fr-fr/library/aa302406.aspx"><a href="http://msdn.microsoft.com/fr-fr/library/aa302406.aspx">http://msdn.microsoft.com/fr-fr/library/aa302406.aspx</a></a><br />
[6] Outil ASP.NET IIS Registration (Aspnet_regiis.exe)<br />
<a href="http://msdn.microsoft.com/fr-fr/library/k6h9cz8h(VS.80).aspx"><a href="http://msdn.microsoft.com/fr-fr/library/k6h9cz8h(VS.80).aspx">http://msdn.microsoft.com/fr-fr/library/k6h9cz8h(VS.80).aspx</a></a><br />
[7] Crypter une section du fichier de configuration avec aspnet_regiis<br />
<a href="http://blogs.developpeur.org/sanzio/archive/2008/04/14/crypter-une-section-du-fichier-de-configuration-avec-aspnet-regiis.aspx"><a href="http://blogs.developpeur.org/sanzio/archive/2008/04/14/crypter-une-section-du-fichier-de-configuration-avec-aspnet-regiis.aspx">http://blogs.developpeur.org/sanzio/archive/2008/04/14/crypter-une-section-du-fichier-de-configuration-avec-aspnet-regiis.aspx</a></a><br />
[8] Secure ADO.NET connections<br />
<a href="http://msdn.microsoft.com/en-us/library/89211k9b(VS.71).aspx"><a href="http://msdn.microsoft.com/en-us/library/89211k9b(VS.71).aspx">http://msdn.microsoft.com/en-us/library/89211k9b(VS.71).aspx</a></a><br />
[9] Le vrai sens de Integrated Security=SSPI<br />
<a href="http://www.doanvanbien.com/voieducode/archives/2006/09/13/21"><a href="http://www.doanvanbien.com/voieducode/archives/2006/09/13/21">http://www.doanvanbien.com/voieducode/archives/2006/09/13/21</a></a><br />
[10] SSPI Reference sur MSDN<br />
<a href="http://msdn.microsoft.com/en-us/library/aa380493(VS.85).aspx"><a href="http://msdn.microsoft.com/en-us/library/aa380493(VS.85).aspx">http://msdn.microsoft.com/en-us/library/aa380493(VS.85).aspx</a></a><br />
[11] Les canaux nomm&#233;s ne fonctionnent pas quand le processus de traitement s'ex&#233;cute sous un compte ASPNET<br />
<a href="http://support.microsoft.com/Default.aspx?id=315159"><a href="http://support.microsoft.com/Default.aspx?id=315159">http://support.microsoft.com/Default.aspx?id=315159</a></a><br />
[12] [SQL] Force the protocol (TCP, Named Pipes, etc.) in your connection string<br />
<a href="http://weblogs.asp.net/jgalloway/archive/2007/02/24/sql-force-the-protocol-tcp-named-pipes-etc-in-your-connection-string.aspx"><a href="http://weblogs.asp.net/jgalloway/archive/2007/02/24/sql-force-the-protocol-tcp-named-pipes-etc-in-your-connection-string.aspx">http://weblogs.asp.net/jgalloway/archive/2007/02/24/sql-force-the-protocol-tcp-named-pipes-etc-in-your-connection-string.aspx</a></a><br />
[13] Choix d&#8217;un protocol r&#233;seau<br />
<a href="http://msdn.microsoft.com/fr-fr/library/ms187892.aspx"><a href="http://msdn.microsoft.com/fr-fr/library/ms187892.aspx">http://msdn.microsoft.com/fr-fr/library/ms187892.aspx</a></a><br />
[14] Cr&#233;ation d&#8217;un DSN ODBC<br />
<a href="http://www.commentcamarche.net/contents/odbc/odbcdsn.php3"><a href="http://www.commentcamarche.net/contents/odbc/odbcdsn.php3">http://www.commentcamarche.net/contents/odbc/odbcdsn.php3</a></a></serveur></serveur></p><div class="item_footer"><p><small><a href="http://www.dotnetguru2.org/amethyste/index.php/2009/07/18/les_chaines_de_connexion">Original post</a> blogged on <a href="http://b2evolution.net/">b2evolution</a>.</small></p></div>]]></content:encoded>
								<comments>http://www.dotnetguru2.org/amethyste/index.php/2009/07/18/les_chaines_de_connexion#comments</comments>
			<wfw:commentRss>http://www.dotnetguru2.org/amethyste/index.php?tempskin=_rss2&#38;disp=comments&#38;p=1093</wfw:commentRss>
		</item>
			</channel>
</rss>
