<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0">
  <channel>
    <title>PiCo journal</title>
    <link>http://blog.couzy.com/</link>
    <description />
    <language>fr-fr</language>
    <copyright>Pierre Couzy</copyright>
    <lastBuildDate>Mon, 27 Oct 2008 19:10:07 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 1.9.6264.0</generator>
    <managingEditor>pierre@couzy.com</managingEditor>
    <webMaster>pierre@couzy.com</webMaster>
    <item>
      <trackback:ping>http://blog.couzy.com/Trackback.aspx?guid=4484ed31-d5ea-4969-8b97-6b9303f0a394</trackback:ping>
      <pingback:server>http://blog.couzy.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.couzy.com/PermaLink,guid,4484ed31-d5ea-4969-8b97-6b9303f0a394.aspx</pingback:target>
      <dc:creator>Pierre Couzy</dc:creator>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Kim Cameron nous présente une session d’introduction à la gestion d’identité, commençant
par un rappel : chaque communication entre deux entités commence par
</p>
        <blockquote>
          <p>
Qui es-tu ? 
</p>
        </blockquote>
        <p>
La discussion file vers la façon la plus naturelle de régler le problème : une base
login/password. Il continue en passant sur Active Directory, puis OTP pour des accès
externes, puis des audits de sécurité, puis … Bref.
</p>
        <p>
 
</p>
        <p>
Ensuite, il prend une comparaison avec la gestion des entrées/sorties en montrant
qu’un flux d’octets est le bon niveau d’abstraction, et complète son analogie en introduisant
la notion de Claims pour porter une information d’identité.
</p>
        <p>
 
</p>
        <p>
Il développe  les grandes notions de façon un peu désordonnée : le besoin d’adoption
du système par les utilisateurs, le besoin de définir des standards, le besoin de
transformer d’un mode de représentation à un autre.. Bref, il nous faut un méta-système
pour englober les spécificités de chaque système et permettre l’unification des formats,
transports et responsabilités.
</p>
        <p>
 
</p>
        <p>
D’où :  Geneva, un framework simplifiant l’implémentation de tout ça
</p>
        <p>
 
</p>
        <p>
Qui es-tu ?
</p>
        <blockquote>
          <p>
insertion dans le App.Config d’une directive 
</p>
          <p>
&lt;federatedAuthentication enabled=”true”&gt;
</p>
          <p>
  wsFederation issuer =”” realm=”” passiveRedirectenabled=”true”
</p>
          <p>
&lt;federatedAuthentication &gt;
</p>
        </blockquote>
        <p>
Que peux-tu faire ?
</p>
        <blockquote>
          <p>
IclaimsIdentity caller = Thread.CurrentPtincpal.Identity as IClaimsIdentity
</p>
          <p>
string role = (from c in caller.claims where c.ClaimType = myClaimstype.Roles
</p>
          <p>
select c.Vaue).Single
</p>
        </blockquote>
        <p>
Geneva en détail : 
</p>
        <p>
 
</p>
        <p>
Le FW 
</p>
        <blockquote>
          <p>
pour créer des applis orientées claims
</p>
        </blockquote>
        <p>
Le Serveur Geneva
</p>
        <blockquote>
          <p>
Un STS intégré à AD
</p>
          <p>
Supporte Cardspace
</p>
          <p>
 
</p>
        </blockquote>
        <p>
Windows Cardspace Geneva
</p>
        <blockquote>
          <p>
Client de fédération (un nouveau client Cardspace)
</p>
        </blockquote>
        <p>
 
</p>
        <p>
Ensuite, on va regarder ce qui se passe côté client : l’autre entreprise, l’autre
utilisateur.
</p>
        <p>
Les arguments sont : le FW supporte WS-Federation, WS-Trust, SAML 2.0, et peut donc
fonctionner avec toute offre logicielle reposant sur l’un de ces standards.
</p>
        <p>
 
</p>
        <p>
DogFooding ?
</p>
        <p>
Nous (MS) utilisons la même architecture en interne, et chaque application chez nous
devient accessible via la Microsoft Federation Gateway, conforme à Ws-Fed et WS-trust
</p>
        <p>
 
</p>
        <p>
Live-ID ?
</p>
        <p>
Conforme au sens où nous savons l’intégrer dans le système de fédération.
</p>
        <p>
Nous lançons Mic’osoft Services Connector qui connecte AD à Mictrosoft Federation
Gateway, download gratuit, pour les clients qui ont besoin d’un accès à la Gateway
et pas plus, c’est bien sûr compatible avec Cardspace.
</p>
        <p>
 
</p>
        <p>
Faut-il impérativement reposer sur une ressource type Cloud, la Federation Gateway,
pour tourner ? On peut tout à fait travailler en deux couches : un Geneva Server en
local, qui sera capable daccepter des communications en provenance de la Gateway si
nécessaire.
</p>
        <p>
 
</p>
        <p>
Encore du neuf : .Net access control service : c’est un service (un STS) qui prend
des claims d’authentification et renvoie des claims d’autoirisation (en gros, on lui
donne des règles et des rôles, et à partir de l’identité il renvoie les rôles auxquels
appartient l’utilisateur). Ce service n’a rien de compliqué à écrire, c’est un peu
l’AzMan du monde de lidentité fédérée
</p>
        <p>
 
</p>
        <p>
Après ces 30 minutes assez intenses (un vrai déluge d’annonces), Kim passe la parole
à Vittorio Bertocci pour une série de démos. Je ne vais sans doute pas les reprendre
dans ce compte-rendu, mais voilà quand même mes notes
</p>
        <p>
 
</p>
        <p>
--
</p>
        <p>
 
</p>
        <p>
La méga-démo reprend tous les éléments. Les forces en présence : une entreprise classique
(ADatum), un éditeur qui fait du SaaS, et le Microsoft Services Identity Backbone
avec tous les blocs derrière
</p>
        <p>
 
</p>
        <p>
La démo commence avec un empoloyé d’Adtum (l’entreprise) qui se loggue sur sa bécane
et file sur une application CRM Online. La partie surprenante : on a eu un SSO entre
adatum (le client initial) et l’application hostée par Microsoft
</p>
        <p>
Traduction : l’appli hostée chez MS a eu besoin d’un token, ce token a été délivré
par la Microsoft Federation Gateway qui est en fédération avec lo’AD de ADatum.
</p>
        <p>
 
</p>
        <p>
Il continue en disant “très bien, on sait le faire chez MS, et si vous voulez être
l’hébergeur ?” En d’autres termes, pouvons-nous dynamiquement assirer la fédération
? Il montre que ça fonctionne, et présente dans les pages de l’application SaaS des
données qui viennent de l’yutilisateur et expliquèe que ces données ont été trannsmises
dynamiquement
</p>
        <p>
 
</p>
        <p>
Il lance un Geneva Server (enfin, la MMC associée) et montrre qu’on peut administrer
des relying parties : à qui puis-je délivrer des tokens. La MMC permet de définir
des claims s’appuyant sur l’Active Directory.
</p>
        <p>
 
</p>
        <p>
On file ensuite sur Fabrikam pour voir comment ils consomment les claims émises par
le serveur Geneva
</p>
        <p>
Il part d’une appli ASP.Net classique (au passage : Zermatt est dans Geneva maintenant).
</p>
        <p>
Il montre qu’il accepte les caims de adatumcorporation, et qu’on fait ensuite des
requêtes LINQ sur les claims
</p>
        <p>
firstname = from c in claims …
</p>
        <p>
 
</p>
        <p>
Fin du scénario : à la fin de la journée, l’employé rentre chez lui. Il ouvre son
portable, retourne sur son applicatyion, mais ce coup-ci il n’y a pas de sso actif
puisque son AD n’est pas là. Donc on lui propose de s’identifier (Geneva et le connector
ont des pages type pour ça, qui proposent CardSpace et un autre que j’ai pas vu)
</p>
        <p>
 
</p>
        <p>
Il montre le nouveau Cardspace : interfae très lég_re, qui lui demande de fournir
es credentials de domaine, et hop ça passe
</p>
        <p>
 
</p>
        <blockquote>
          <p>
le cheminement : de chez moi je file vers l’AD de mon entreprise, qui me délivre un
jeton consommable par l’appli SaaS
</p>
        </blockquote>
        <p>
 
</p>
        <p>
Il termine en montrant une modification : refusée, il n’est pas manager. Mais ici
on montre qu’on peut rendre magique ce déblocage d’accès : il utilise .Net Access
Control Service
</p>
        <p>
 
</p>
        <p>
Il montre une appli qui utilise les APIS de gestion d’Azure et montre de façon graphique
les règles qui présiednt à la transformation des claims donnant les claims d’autorisation
</p>
        <p>
 
</p>
        <p>
La fin : comment raccordement à LiveId, puis interop avec Tivoli d’IBM, avec le <strong>protocole</strong> SAML
2
</p>
        <p>
 
</p>
        <p>
11h56 : passe la parole à Kim
</p>
        <p>
 
</p>
        <p>
Oh : LiveId est maintenant BootStrappé sur OpenId (j’ai pas plus d’infos pour le moment,
pas de lien )
</p>
        <p>
Donc pour vos sites et applis : soit Live Framework (LiveId-based?), soit Framework
Geneva, soit OpenId
</p>
        <p>
 
</p>
        <p>
Geneva Server : 
</p>
        <blockquote>
          <p>
Genevca RTM H2 CY09
</p>
          <p>
13h45 : Geneva server Overview
</p>
          <p>
3h30 : cpo,ecting AD to %ocrosoft Services
</p>
        </blockquote>
        <img width="0" height="0" src="http://blog.couzy.com/aggbug.ashx?id=4484ed31-d5ea-4969-8b97-6b9303f0a394" />
      </body>
      <title>S+S et identit&amp;eacute;, compte-rendu de session</title>
      <guid isPermaLink="false">http://blog.couzy.com/PermaLink,guid,4484ed31-d5ea-4969-8b97-6b9303f0a394.aspx</guid>
      <link>http://blog.couzy.com/PermaLink,guid,4484ed31-d5ea-4969-8b97-6b9303f0a394.aspx</link>
      <pubDate>Mon, 27 Oct 2008 19:10:07 GMT</pubDate>
      <description>&lt;p&gt;
Kim Cameron nous présente une session d’introduction à la gestion d’identité, commençant
par un rappel : chaque communication entre deux entités commence par
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
Qui es-tu ? 
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
La discussion file vers la façon la plus naturelle de régler le problème : une base
login/password. Il continue en passant sur Active Directory, puis OTP pour des accès
externes, puis des audits de sécurité, puis … Bref.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Ensuite, il prend une comparaison avec la gestion des entrées/sorties en montrant
qu’un flux d’octets est le bon niveau d’abstraction, et complète son analogie en introduisant
la notion de Claims pour porter une information d’identité.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Il développe&amp;nbsp; les grandes notions de façon un peu désordonnée : le besoin d’adoption
du système par les utilisateurs, le besoin de définir des standards, le besoin de
transformer d’un mode de représentation à un autre.. Bref, il nous faut un méta-système
pour englober les spécificités de chaque système et permettre l’unification des formats,
transports et responsabilités.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
D’où :&amp;nbsp; Geneva, un framework simplifiant l’implémentation de tout ça
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Qui es-tu ?
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
insertion dans le App.Config d’une directive 
&lt;/p&gt;
&lt;p&gt;
&amp;lt;federatedAuthentication enabled=”true”&amp;gt;
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp; wsFederation issuer =”” realm=”” passiveRedirectenabled=”true”
&lt;/p&gt;
&lt;p&gt;
&amp;lt;federatedAuthentication &amp;gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Que peux-tu faire ?
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
IclaimsIdentity caller = Thread.CurrentPtincpal.Identity as IClaimsIdentity
&lt;/p&gt;
&lt;p&gt;
string role = (from c in caller.claims where c.ClaimType = myClaimstype.Roles
&lt;/p&gt;
&lt;p&gt;
select c.Vaue).Single
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Geneva en détail : 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Le FW 
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
pour créer des applis orientées claims
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Le Serveur Geneva
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
Un STS intégré à AD
&lt;/p&gt;
&lt;p&gt;
Supporte Cardspace
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
Windows Cardspace Geneva
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
Client de fédération (un nouveau client Cardspace)
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Ensuite, on va regarder ce qui se passe côté client : l’autre entreprise, l’autre
utilisateur.
&lt;/p&gt;
&lt;p&gt;
Les arguments sont : le FW supporte WS-Federation, WS-Trust, SAML 2.0, et peut donc
fonctionner avec toute offre logicielle reposant sur l’un de ces standards.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
DogFooding ?
&lt;/p&gt;
&lt;p&gt;
Nous (MS) utilisons la même architecture en interne, et chaque application chez nous
devient accessible via la Microsoft Federation Gateway, conforme à Ws-Fed et WS-trust
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Live-ID ?
&lt;/p&gt;
&lt;p&gt;
Conforme au sens où nous savons l’intégrer dans le système de fédération.
&lt;/p&gt;
&lt;p&gt;
Nous lançons Mic’osoft Services Connector qui connecte AD à Mictrosoft Federation
Gateway, download gratuit, pour les clients qui ont besoin d’un accès à la Gateway
et pas plus, c’est bien sûr compatible avec Cardspace.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Faut-il impérativement reposer sur une ressource type Cloud, la Federation Gateway,
pour tourner ? On peut tout à fait travailler en deux couches : un Geneva Server en
local, qui sera capable daccepter des communications en provenance de la Gateway si
nécessaire.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Encore du neuf : .Net access control service : c’est un service (un STS) qui prend
des claims d’authentification et renvoie des claims d’autoirisation (en gros, on lui
donne des règles et des rôles, et à partir de l’identité il renvoie les rôles auxquels
appartient l’utilisateur). Ce service n’a rien de compliqué à écrire, c’est un peu
l’AzMan du monde de lidentité fédérée
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Après ces 30 minutes assez intenses (un vrai déluge d’annonces), Kim passe la parole
à Vittorio Bertocci pour une série de démos. Je ne vais sans doute pas les reprendre
dans ce compte-rendu, mais voilà quand même mes notes
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
--
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
La méga-démo reprend tous les éléments. Les forces en présence : une entreprise classique
(ADatum), un éditeur qui fait du SaaS, et le Microsoft Services Identity Backbone
avec tous les blocs derrière
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
La démo commence avec un empoloyé d’Adtum (l’entreprise) qui se loggue sur sa bécane
et file sur une application CRM Online. La partie surprenante : on a eu un SSO entre
adatum (le client initial) et l’application hostée par Microsoft
&lt;/p&gt;
&lt;p&gt;
Traduction : l’appli hostée chez MS a eu besoin d’un token, ce token a été délivré
par la Microsoft Federation Gateway qui est en fédération avec lo’AD de ADatum.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Il continue en disant “très bien, on sait le faire chez MS, et si vous voulez être
l’hébergeur ?” En d’autres termes, pouvons-nous dynamiquement assirer la fédération
? Il montre que ça fonctionne, et présente dans les pages de l’application SaaS des
données qui viennent de l’yutilisateur et expliquèe que ces données ont été trannsmises
dynamiquement
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Il lance un Geneva Server (enfin, la MMC associée) et montrre qu’on peut administrer
des relying parties : à qui puis-je délivrer des tokens. La MMC permet de définir
des claims s’appuyant sur l’Active Directory.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
On file ensuite sur Fabrikam pour voir comment ils consomment les claims émises par
le serveur Geneva
&lt;/p&gt;
&lt;p&gt;
Il part d’une appli ASP.Net classique (au passage : Zermatt est dans Geneva maintenant).
&lt;/p&gt;
&lt;p&gt;
Il montre qu’il accepte les caims de adatumcorporation, et qu’on fait ensuite des
requêtes LINQ sur les claims
&lt;/p&gt;
&lt;p&gt;
firstname = from c in claims …
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Fin du scénario : à la fin de la journée, l’employé rentre chez lui. Il ouvre son
portable, retourne sur son applicatyion, mais ce coup-ci il n’y a pas de sso actif
puisque son AD n’est pas là. Donc on lui propose de s’identifier (Geneva et le connector
ont des pages type pour ça, qui proposent CardSpace et un autre que j’ai pas vu)
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Il montre le nouveau Cardspace : interfae très lég_re, qui lui demande de fournir
es credentials de domaine, et hop ça passe
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
le cheminement : de chez moi je file vers l’AD de mon entreprise, qui me délivre un
jeton consommable par l’appli SaaS
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Il termine en montrant une modification : refusée, il n’est pas manager. Mais ici
on montre qu’on peut rendre magique ce déblocage d’accès : il utilise .Net Access
Control Service
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Il montre une appli qui utilise les APIS de gestion d’Azure et montre de façon graphique
les règles qui présiednt à la transformation des claims donnant les claims d’autorisation
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
La fin : comment raccordement à LiveId, puis interop avec Tivoli d’IBM, avec le &lt;strong&gt;protocole&lt;/strong&gt; SAML
2
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
11h56 : passe la parole à Kim
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Oh : LiveId est maintenant BootStrappé sur OpenId (j’ai pas plus d’infos pour le moment,
pas de lien )
&lt;/p&gt;
&lt;p&gt;
Donc pour vos sites et applis : soit Live Framework (LiveId-based?), soit Framework
Geneva, soit OpenId
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Geneva Server : 
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
Genevca RTM H2 CY09
&lt;/p&gt;
&lt;p&gt;
13h45 : Geneva server Overview
&lt;/p&gt;
&lt;p&gt;
3h30 : cpo,ecting AD to %ocrosoft Services
&lt;/p&gt;
&lt;/blockquote&gt;&lt;img width="0" height="0" src="http://blog.couzy.com/aggbug.ashx?id=4484ed31-d5ea-4969-8b97-6b9303f0a394" /&gt;</description>
    </item>
    <item>
      <trackback:ping>http://blog.couzy.com/Trackback.aspx?guid=3491b1fb-9ec5-45fe-bc08-7cba822a13f6</trackback:ping>
      <pingback:server>http://blog.couzy.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.couzy.com/PermaLink,guid,3491b1fb-9ec5-45fe-bc08-7cba822a13f6.aspx</pingback:target>
      <dc:creator>Pierre Couzy</dc:creator>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
J’ai réinstallé récemment ma machine sous Windows Server 2008, pour profiter un peu
d’Hyper-V notamment, et j’ai découvert à  mon grand dam qu’hyper-V est incompatible
avec la mise en veille.  Moi qui redémarre ma machine une à deux fois par trimestre,
c’est un peu dur.
</p>
        <p>
 
</p>
        <p>
Bref, après des recherches un peu longues, j’ai trouvé un contournement simple : ne
pas lancer hyper-V tant que je n’en ai pas besoin. Ca se fait à coup de base de registre
: 
</p>
        <p>
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\hvboot]
</p>
        <p>
Là-dedans, passez Start à 3 au lieu de 1, et vous récupérez la mise en veille de votre
belle machine. 
</p>
        <p>
Lorsque vous avez besoin d’Hyper-V, un petit command prompt et<strong>  net start
hvboot</strong> réactive Hyper-V. Ensuite il faudra arrêter le portable au lieu de
le mettre en veille, mais du coup je peux descendre à 4 reboots par semaine, beaucoup
plus agréable que 20..
</p>
        <p>
 
</p>
        <p>
Pour les maniaques du clavier, j’ai aussi remappé les touches qui entourent les flèches
de direction. Par défaut elles font Précédent/Suivant dans IE, je préfère PageUp et
PageDown. Pour ça, copiez ceci dans un fichier .reg :
</p>
        <p>
 
</p>
        <p>
          <strong>Windows Registry Editor Version 5.00 </strong>
        </p>
        <p>
          <strong>[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout]<br />
"Scancode Map"=hex:00,00,00,00,00,00,00,00,03,00,00,00,69,00,51,00,6A,00,49,00,\<br />
  00,00,00,00</strong>
        </p>
        <p>
 
</p>
        <p>
 
</p>
        <p>
Puis double-cliquez dessus et rebootez.
</p>
        <p>
Pour les curieux, voilà ce que ça dit : les données hexa se lisent par paquets de
4. Les deux  premiers sont décoratifs (lire : réservés pour usage ultérieur),
le 3e indique le nombre de touches à remapper, les trois  suivants sont les scancodes
de la touche à remplacer et de la touche qui la remplace, le dernier remplace rien
par rien, c’est comme ça qu’on indique qu’on a terminé le remappage.
</p>
        <img width="0" height="0" src="http://blog.couzy.com/aggbug.ashx?id=3491b1fb-9ec5-45fe-bc08-7cba822a13f6" />
      </body>
      <title>Windows Server 2008 sur un T61</title>
      <guid isPermaLink="false">http://blog.couzy.com/PermaLink,guid,3491b1fb-9ec5-45fe-bc08-7cba822a13f6.aspx</guid>
      <link>http://blog.couzy.com/PermaLink,guid,3491b1fb-9ec5-45fe-bc08-7cba822a13f6.aspx</link>
      <pubDate>Thu, 09 Oct 2008 13:37:55 GMT</pubDate>
      <description>&lt;p&gt;
J’ai réinstallé récemment ma machine sous Windows Server 2008, pour profiter un peu
d’Hyper-V notamment, et j’ai découvert à&amp;nbsp; mon grand dam qu’hyper-V est incompatible
avec la mise en veille.&amp;nbsp; Moi qui redémarre ma machine une à deux fois par trimestre,
c’est un peu dur.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Bref, après des recherches un peu longues, j’ai trouvé un contournement simple : ne
pas lancer hyper-V tant que je n’en ai pas besoin. Ca se fait à coup de base de registre
: 
&lt;/p&gt;
&lt;p&gt;
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\hvboot]
&lt;/p&gt;
&lt;p&gt;
Là-dedans, passez Start à 3 au lieu de 1, et vous récupérez la mise en veille de votre
belle machine. 
&lt;/p&gt;
&lt;p&gt;
Lorsque vous avez besoin d’Hyper-V, un petit command prompt et&lt;strong&gt;&amp;nbsp; net start
hvboot&lt;/strong&gt; réactive Hyper-V. Ensuite il faudra arrêter le portable au lieu de
le mettre en veille, mais du coup je peux descendre à 4 reboots par semaine, beaucoup
plus agréable que 20..
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Pour les maniaques du clavier, j’ai aussi remappé les touches qui entourent les flèches
de direction. Par défaut elles font Précédent/Suivant dans IE, je préfère PageUp et
PageDown. Pour ça, copiez ceci dans un fichier .reg :
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Windows Registry Editor Version 5.00 &lt;/strong&gt; 
&lt;p&gt;
&lt;strong&gt;[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout]&lt;br&gt;
"Scancode Map"=hex:00,00,00,00,00,00,00,00,03,00,00,00,69,00,51,00,6A,00,49,00,\&lt;br&gt;
&amp;nbsp; 00,00,00,00&lt;/strong&gt; 
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Puis double-cliquez dessus et rebootez.
&lt;/p&gt;
&lt;p&gt;
Pour les curieux, voilà ce que ça dit : les données hexa se lisent par paquets de
4. Les deux&amp;nbsp; premiers sont décoratifs (lire : réservés pour usage ultérieur),
le 3e indique le nombre de touches à remapper, les trois&amp;nbsp; suivants sont les scancodes
de la touche à remplacer et de la touche qui la remplace, le dernier remplace rien
par rien, c’est comme ça qu’on indique qu’on a terminé le remappage.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.couzy.com/aggbug.ashx?id=3491b1fb-9ec5-45fe-bc08-7cba822a13f6" /&gt;</description>
    </item>
    <item>
      <trackback:ping>http://blog.couzy.com/Trackback.aspx?guid=ab8b0f3e-f4bb-4655-8e19-447e0d13725a</trackback:ping>
      <pingback:server>http://blog.couzy.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.couzy.com/PermaLink,guid,ab8b0f3e-f4bb-4655-8e19-447e0d13725a.aspx</pingback:target>
      <dc:creator>Pierre Couzy</dc:creator>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <a href="http://blog.couzy.com/content/binary/WindowsLiveWriter/DcouplerunclientetunserveuravecMSMQ_E5F4/image_2.png">
            <img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" border="0" alt="Activer MSMQ sous Vista" align="right" src="http://blog.couzy.com/content/binary/WindowsLiveWriter/DcouplerunclientetunserveuravecMSMQ_E5F4/image_thumb.png" width="317" height="280" />
          </a>Que
se passe-t-il lorsque le temps de traitement sur un serveur dépasse le rythme d'envoi
par les clients ? Si le rythme <strong>moyen</strong> dépasse la capacité de traitement,
il faut un plus gros serveur, mais 9 fois sur 10 c'est le rythme <strong>en pic</strong> qui
pose problème. Microsoft fournit une solution depuis NT4 : Message Queue Server (ou
MSMQ), un serveur de messagerie applicative.
</p>
        <p>
Si MSMQ est installé sur votre serveur, et que la communication entre les clients
et le serveur est faite en WCF, vous pouvez très simplement vous appuyer sur MSMQ
pour absorber les pics de charge.
</p>
        <p>
 
</p>
        <p>
Pour fixer les idées, imaginez le problème suivant : Votre serveur permet d'envoyer
des SMS, mais il est limité à un message/seconde. Vos clients envoient le matin des
vagues de SMS. Qu'un SMS mette 15 minutes à parvenir à destination n'est pas dramatique,
mais il est impératif que chaque SMS soit transmis à son destinataire. 
</p>
        <p>
En termes techniques, le serveur expose le contrat de service suivant :
</p>
        <p>
 
</p>
        <pre class="csharpcode">[ServiceContract]
<span class="kwrd">interface</span> ICommunicationsDiverses
{ [OperationContract (IsOneWay=<span class="kwrd">true</span>) ] <span class="kwrd">void</span> EnvoieSMS(<span class="kwrd">string</span> numero, <span class="kwrd">string</span> sms);
} <a href="http://blog.couzy.com/content/binary/WindowsLiveWriter/DcouplerunclientetunserveuravecMSMQ_E5F4/image_6.png"></a></pre>
        <style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
        <p>
          <a href="http://blog.couzy.com/content/binary/WindowsLiveWriter/DcouplerunclientetunserveuravecMSMQ_E5F4/image_4.png">
            <img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" border="0" alt="image" align="right" src="http://blog.couzy.com/content/binary/WindowsLiveWriter/DcouplerunclientetunserveuravecMSMQ_E5F4/image_thumb_1.png" width="403" height="250" />
          </a>  
</p>
        <p>
Puisque nous allons stocker les demandes d'exécution en file d'attente, l'opération
d'envoi de SMS ne peut pas renvoyer directement de message, il faut donc une signature
void dans l'implémentation et un attribut IsOneWay dans le contrat.
</p>
        <p>
 
</p>
        <p>
La communication met maintenant en jeu trois acteurs : les clients, le serveur, et
la file d'attente qui s'intercale entre les deux. Cette dernière doit être déclarée
sur le poste serveur.
</p>
        <p>
La suite est un simple travail de configuration, consistant à préciser aux clients
et au serveur qu'ils doivent passer par la file d'attente pour se passer les messages
:
</p>
        <pre class="csharpcode">
          <span class="kwrd">&lt;?</span>
          <span class="html">xml</span>
          <span class="attr">version</span>
          <span class="kwrd">="1.0"</span>
          <span class="attr">encoding</span>
          <span class="kwrd">="utf-8"</span> ?<span class="kwrd">&gt;</span><span class="kwrd">&lt;</span><span class="html">configuration</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;</span><span class="html">system.serviceModel</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;</span><span class="html">bindings</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;</span><span class="html">netMsmqBinding</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;</span><span class="html">binding</span><span class="attr">name</span><span class="kwrd">="monBindingMSMQ"</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;</span><span class="html">security</span><span class="attr">mode</span><span class="kwrd">="None"</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;</span><span class="html">transport</span><span class="attr">msmqAuthenticationMode</span><span class="kwrd">="None"</span><span class="attr">msmqProtectionLevel</span><span class="kwrd">="None"</span><span class="kwrd">/&gt;</span><span class="kwrd">&lt;</span><span class="html">message</span><span class="attr">clientCredentialType</span><span class="kwrd">="None"</span><span class="kwrd">/&gt;</span><span class="kwrd">&lt;/</span><span class="html">security</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;/</span><span class="html">binding</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;/</span><span class="html">netMsmqBinding</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;/</span><span class="html">bindings</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;</span><span class="html">client</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;</span><span class="html">endpoint</span><span class="attr">name</span><span class="kwrd">="nomDuEndPoint"</span><span class="attr">address</span><span class="kwrd">="net.msmq://localhost/Private/MaFile"</span><span class="attr">binding</span><span class="kwrd">="netMsmqBinding"</span><span class="attr">contract</span><span class="kwrd">="ICommunicationsDiverses"</span><span class="attr">bindingConfiguration</span><span class="kwrd">="monBindingMSMQ"</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;/</span><span class="html">endpoint</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;/</span><span class="html">client</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;/</span><span class="html">system.serviceModel</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;/</span><span class="html">configuration</span><span class="kwrd">&gt;</span></pre>
        <style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
Et pour le serveur : <pre class="csharpcode"><span class="kwrd">&lt;?</span><span class="html">xml</span><span class="attr">version</span><span class="kwrd">="1.0"</span><span class="attr">encoding</span><span class="kwrd">="utf-8"</span> ?<span class="kwrd">&gt;</span><span class="kwrd">&lt;</span><span class="html">configuration</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;</span><span class="html">system.serviceModel</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;</span><span class="html">bindings</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;</span><span class="html">netMsmqBinding</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;</span><span class="html">binding</span><span class="attr">name</span><span class="kwrd">="monBindingMSMQ"</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;</span><span class="html">security</span><span class="attr">mode</span><span class="kwrd">="None"</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;</span><span class="html">transport</span><span class="attr">msmqAuthenticationMode</span><span class="kwrd">="None"</span><span class="attr">msmqProtectionLevel</span><span class="kwrd">="None"</span><span class="kwrd">/&gt;</span><span class="kwrd">&lt;</span><span class="html">message</span><span class="attr">clientCredentialType</span><span class="kwrd">="None"</span><span class="kwrd">/&gt;</span><span class="kwrd">&lt;/</span><span class="html">security</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;/</span><span class="html">binding</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;/</span><span class="html">netMsmqBinding</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;/</span><span class="html">bindings</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;</span><span class="html">services</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;</span><span class="html">service</span><span class="attr">name</span><span class="kwrd">="MonAppliSuperCompliquee.ClasseImplementantLInterface"</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;</span><span class="html">endpoint</span><span class="attr">address</span><span class="kwrd">="net.msmq://localhost/Private/MaFile"</span><span class="attr">binding</span><span class="kwrd">="netMsmqBinding"</span><span class="attr">bindingConfiguration</span><span class="kwrd">="monBindingMSMQ"</span><span class="attr">name</span><span class="kwrd">="nomEndPointServeur"</span><span class="attr">contract</span><span class="kwrd">="ICommunicationsDiverses"</span><span class="kwrd">/&gt;</span><span class="kwrd">&lt;/</span><span class="html">service</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;/</span><span class="html">services</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;/</span><span class="html">system.serviceModel</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;/</span><span class="html">configuration</span><span class="kwrd">&gt;</span></pre><p><style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style></p><p>
C'est tout. A partir de maintenant, les appels fonctionneront même si le serveur est
arrêté, puisqu'ils sont stockés dans la file d'attente, et le serveur les traitera
un à un quel que soit le nombre d'appels en attente.
</p><img width="0" height="0" src="http://blog.couzy.com/aggbug.ashx?id=ab8b0f3e-f4bb-4655-8e19-447e0d13725a" /></body>
      <title>D&amp;eacute;coupler un client et un serveur avec MSMQ</title>
      <guid isPermaLink="false">http://blog.couzy.com/PermaLink,guid,ab8b0f3e-f4bb-4655-8e19-447e0d13725a.aspx</guid>
      <link>http://blog.couzy.com/PermaLink,guid,ab8b0f3e-f4bb-4655-8e19-447e0d13725a.aspx</link>
      <pubDate>Mon, 07 Apr 2008 14:21:18 GMT</pubDate>
      <description>&lt;p&gt;
&lt;a href="http://blog.couzy.com/content/binary/WindowsLiveWriter/DcouplerunclientetunserveuravecMSMQ_E5F4/image_2.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" border="0" alt="Activer MSMQ sous Vista" align="right" src="http://blog.couzy.com/content/binary/WindowsLiveWriter/DcouplerunclientetunserveuravecMSMQ_E5F4/image_thumb.png" width="317" height="280"&gt;&lt;/a&gt;Que
se passe-t-il lorsque le temps de traitement sur un serveur dépasse le rythme d'envoi
par les clients ? Si le rythme &lt;strong&gt;moyen&lt;/strong&gt; dépasse la capacité de traitement,
il faut un plus gros serveur, mais 9 fois sur 10 c'est le rythme &lt;strong&gt;en pic&lt;/strong&gt; qui
pose problème. Microsoft fournit une solution depuis NT4 : Message Queue Server (ou
MSMQ), un serveur de messagerie applicative.
&lt;/p&gt;
&lt;p&gt;
Si MSMQ est installé sur votre serveur, et que la communication entre les clients
et le serveur est faite en WCF, vous pouvez très simplement vous appuyer sur MSMQ
pour absorber les pics de charge.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Pour fixer les idées, imaginez le problème suivant : Votre serveur permet d'envoyer
des SMS, mais il est limité à un message/seconde. Vos clients envoient le matin des
vagues de SMS. Qu'un SMS mette 15 minutes à parvenir à destination n'est pas dramatique,
mais il est impératif que chaque SMS soit transmis à son destinataire. 
&lt;/p&gt;
&lt;p&gt;
En termes techniques, le serveur expose le contrat de service suivant :
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;pre class="csharpcode"&gt;[ServiceContract]
&lt;span class="kwrd"&gt;interface&lt;/span&gt; ICommunicationsDiverses
{ [OperationContract (IsOneWay=&lt;span class="kwrd"&gt;true&lt;/span&gt;) ] &lt;span class="kwrd"&gt;void&lt;/span&gt; EnvoieSMS(&lt;span class="kwrd"&gt;string&lt;/span&gt; numero, &lt;span class="kwrd"&gt;string&lt;/span&gt; sms);
} &lt;a href="http://blog.couzy.com/content/binary/WindowsLiveWriter/DcouplerunclientetunserveuravecMSMQ_E5F4/image_6.png"&gt;&lt;/a&gt;&lt;/pre&gt;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;
&lt;p&gt;
&lt;a href="http://blog.couzy.com/content/binary/WindowsLiveWriter/DcouplerunclientetunserveuravecMSMQ_E5F4/image_4.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" border="0" alt="image" align="right" src="http://blog.couzy.com/content/binary/WindowsLiveWriter/DcouplerunclientetunserveuravecMSMQ_E5F4/image_thumb_1.png" width="403" height="250"&gt;&lt;/a&gt;&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
Puisque nous allons stocker les demandes d'exécution en file d'attente, l'opération
d'envoi de SMS ne peut pas renvoyer directement de message, il faut donc une signature
void dans l'implémentation et un attribut IsOneWay dans le contrat.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
La communication met maintenant en jeu trois acteurs : les clients, le serveur, et
la file d'attente qui s'intercale entre les deux. Cette dernière doit être déclarée
sur le poste serveur.
&lt;/p&gt;
&lt;p&gt;
La suite est un simple travail de configuration, consistant à préciser aux clients
et au serveur qu'ils doivent passer par la file d'attente pour se passer les messages
:
&lt;/p&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;?&lt;/span&gt;&lt;span class="html"&gt;xml&lt;/span&gt; &lt;span class="attr"&gt;version&lt;/span&gt;&lt;span class="kwrd"&gt;="1.0"&lt;/span&gt; &lt;span class="attr"&gt;encoding&lt;/span&gt;&lt;span class="kwrd"&gt;="utf-8"&lt;/span&gt; ?&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;configuration&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;system.serviceModel&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;bindings&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;netMsmqBinding&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;binding&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;="monBindingMSMQ"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;security&lt;/span&gt; &lt;span class="attr"&gt;mode&lt;/span&gt;&lt;span class="kwrd"&gt;="None"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;transport&lt;/span&gt; &lt;span class="attr"&gt;msmqAuthenticationMode&lt;/span&gt;&lt;span class="kwrd"&gt;="None"&lt;/span&gt; &lt;span class="attr"&gt;msmqProtectionLevel&lt;/span&gt;&lt;span class="kwrd"&gt;="None"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;message&lt;/span&gt; &lt;span class="attr"&gt;clientCredentialType&lt;/span&gt;&lt;span class="kwrd"&gt;="None"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;security&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;binding&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;netMsmqBinding&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;bindings&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;client&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;endpoint&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;="nomDuEndPoint"&lt;/span&gt; &lt;span class="attr"&gt;address&lt;/span&gt;&lt;span class="kwrd"&gt;="net.msmq://localhost/Private/MaFile"&lt;/span&gt; &lt;span class="attr"&gt;binding&lt;/span&gt;&lt;span class="kwrd"&gt;="netMsmqBinding"&lt;/span&gt; &lt;span class="attr"&gt;contract&lt;/span&gt;&lt;span class="kwrd"&gt;="ICommunicationsDiverses"&lt;/span&gt; &lt;span class="attr"&gt;bindingConfiguration&lt;/span&gt;&lt;span class="kwrd"&gt;="monBindingMSMQ"&lt;/span&gt; &lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;endpoint&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;client&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;system.serviceModel&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;configuration&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;
Et pour le serveur : &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;?&lt;/span&gt;&lt;span class="html"&gt;xml&lt;/span&gt; &lt;span class="attr"&gt;version&lt;/span&gt;&lt;span class="kwrd"&gt;="1.0"&lt;/span&gt; &lt;span class="attr"&gt;encoding&lt;/span&gt;&lt;span class="kwrd"&gt;="utf-8"&lt;/span&gt; ?&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;configuration&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;system.serviceModel&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;bindings&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;netMsmqBinding&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;binding&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;="monBindingMSMQ"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;security&lt;/span&gt; &lt;span class="attr"&gt;mode&lt;/span&gt;&lt;span class="kwrd"&gt;="None"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;transport&lt;/span&gt; &lt;span class="attr"&gt;msmqAuthenticationMode&lt;/span&gt;&lt;span class="kwrd"&gt;="None"&lt;/span&gt; &lt;span class="attr"&gt;msmqProtectionLevel&lt;/span&gt;&lt;span class="kwrd"&gt;="None"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;message&lt;/span&gt; &lt;span class="attr"&gt;clientCredentialType&lt;/span&gt;&lt;span class="kwrd"&gt;="None"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;security&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;binding&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;netMsmqBinding&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;bindings&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;services&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;service&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;="MonAppliSuperCompliquee.ClasseImplementantLInterface"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;endpoint&lt;/span&gt; &lt;span class="attr"&gt;address&lt;/span&gt;&lt;span class="kwrd"&gt;="net.msmq://localhost/Private/MaFile"&lt;/span&gt; &lt;span class="attr"&gt;binding&lt;/span&gt;&lt;span class="kwrd"&gt;="netMsmqBinding"&lt;/span&gt; &lt;span class="attr"&gt;bindingConfiguration&lt;/span&gt;&lt;span class="kwrd"&gt;="monBindingMSMQ"&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;="nomEndPointServeur"&lt;/span&gt; &lt;span class="attr"&gt;contract&lt;/span&gt;&lt;span class="kwrd"&gt;="ICommunicationsDiverses"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;service&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;services&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;system.serviceModel&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;configuration&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt; &lt;/pre&gt;
&lt;p&gt;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;
&lt;/p&gt;
&lt;p&gt;
C'est tout. A partir de maintenant, les appels fonctionneront même si le serveur est
arrêté, puisqu'ils sont stockés dans la file d'attente, et le serveur les traitera
un à un quel que soit le nombre d'appels en attente.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.couzy.com/aggbug.ashx?id=ab8b0f3e-f4bb-4655-8e19-447e0d13725a" /&gt;</description>
    </item>
    <item>
      <trackback:ping>http://blog.couzy.com/Trackback.aspx?guid=f5e23c0b-b2ba-45cc-a4bb-df79ec81d97e</trackback:ping>
      <pingback:server>http://blog.couzy.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.couzy.com/PermaLink,guid,f5e23c0b-b2ba-45cc-a4bb-df79ec81d97e.aspx</pingback:target>
      <dc:creator>Pierre Couzy</dc:creator>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
J'ai récupéré ce matin le code source de SharpSTS (un toolkit pour cardspace), et
il m'a fallu quelques recherches pour réussir à récupérer le code source depuis CodePlex,
voilà le résultat de mes pérégrinations.
</p>
        <p>
 
</p>
        <h2>1/ Installez un client SubVersion
</h2>
        <p>
Récupérez un client subversion. TortoiseSVN est simple d'emploi, maintenu, et en plus
il a des icônes rigolotes.
</p>
        <p>
          <a title="http://tortoisesvn.net/" href="http://tortoisesvn.net/">http://tortoisesvn.net/</a>
        </p>
        <h2>2/ Installez et lancez SvnBridge
</h2>
        <p>
CodePlex fonctionne en réalité sous Team Foundation Server, vous allez donc installer
sur votre machine un petit proxy SVN &lt;=&gt; TFS 
</p>
        <p>
          <a title="http://www.codeplex.com/SvnBridge/" href="http://www.codeplex.com/SvnBridge/">http://www.codeplex.com/SvnBridge/</a>
        </p>
        <p>
 
</p>
        <p>
          <a href="http://blog.couzy.com/content/binary/WindowsLiveWriter/UtiliserTortoiseSvnpourseconnecterCodePl_F03C/image_2.png">
          </a>
          <a href="http://blog.couzy.com/content/binary/WindowsLiveWriter/UtiliserTortoiseSvnpourseconnecterCodePl_F03C/image_6.png">
            <img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" border="0" alt="image" src="http://blog.couzy.com/content/binary/WindowsLiveWriter/UtiliserTortoiseSvnpourseconnecterCodePl_F03C/image_thumb_2.png" width="335" height="135" />
          </a>  
</p>
        <p>
Le port est ce que vous voulez de disponible sur votre machine, l'adresse du serveur
TFS est indiquée sur la page du projet CodePlex qui vous intéresse :
</p>
        <p>
          <a href="http://blog.couzy.com/content/binary/WindowsLiveWriter/UtiliserTortoiseSvnpourseconnecterCodePl_F03C/image_4.png">
            <img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" border="0" alt="image" src="http://blog.couzy.com/content/binary/WindowsLiveWriter/UtiliserTortoiseSvnpourseconnecterCodePl_F03C/image_thumb_1.png" width="597" height="284" />
          </a>
        </p>
        <h2>3/ Récupérez le code source 
</h2>
        <p>
Faites-vous un répertoire là où vous voulez une copie des sources, un clic droit,
et c'est tout : 
</p>
        <p>
          <a href="http://blog.couzy.com/content/binary/WindowsLiveWriter/UtiliserTortoiseSvnpourseconnecterCodePl_F03C/image_8.png">
          </a>
          <a href="http://blog.couzy.com/content/binary/WindowsLiveWriter/UtiliserTortoiseSvnpourseconnecterCodePl_F03C/image_10.png">
            <img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" border="0" alt="image" src="http://blog.couzy.com/content/binary/WindowsLiveWriter/UtiliserTortoiseSvnpourseconnecterCodePl_F03C/image_thumb_4.png" width="773" height="562" />
          </a>  
</p>
        <h2>4/ Et pour les commits ?
</h2>
        <p>
Il vous faudra un compte avec les droits de mise à jour sur le projet. Attention,
le compte n'est pas directement votre login CodePlex : c'est <strong>snd\votreusername_cp</strong></p>
        <img width="0" height="0" src="http://blog.couzy.com/aggbug.ashx?id=f5e23c0b-b2ba-45cc-a4bb-df79ec81d97e" />
      </body>
      <title>Utiliser TortoiseSvn pour se connecter &amp;agrave; CodePlex</title>
      <guid isPermaLink="false">http://blog.couzy.com/PermaLink,guid,f5e23c0b-b2ba-45cc-a4bb-df79ec81d97e.aspx</guid>
      <link>http://blog.couzy.com/PermaLink,guid,f5e23c0b-b2ba-45cc-a4bb-df79ec81d97e.aspx</link>
      <pubDate>Wed, 02 Apr 2008 15:05:17 GMT</pubDate>
      <description>&lt;p&gt;
J'ai récupéré ce matin le code source de SharpSTS (un toolkit pour cardspace), et
il m'a fallu quelques recherches pour réussir à récupérer le code source depuis CodePlex,
voilà le résultat de mes pérégrinations.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;h2&gt;1/ Installez un client SubVersion
&lt;/h2&gt;
&lt;p&gt;
Récupérez un client subversion. TortoiseSVN est simple d'emploi, maintenu, et en plus
il a des icônes rigolotes.
&lt;/p&gt;
&lt;p&gt;
&lt;a title="http://tortoisesvn.net/" href="http://tortoisesvn.net/"&gt;http://tortoisesvn.net/&lt;/a&gt;
&lt;/p&gt;
&lt;h2&gt;2/ Installez et lancez SvnBridge
&lt;/h2&gt;
&lt;p&gt;
CodePlex fonctionne en réalité sous Team Foundation Server, vous allez donc installer
sur votre machine un petit proxy SVN &amp;lt;=&amp;gt; TFS 
&lt;/p&gt;
&lt;p&gt;
&lt;a title="http://www.codeplex.com/SvnBridge/" href="http://www.codeplex.com/SvnBridge/"&gt;http://www.codeplex.com/SvnBridge/&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://blog.couzy.com/content/binary/WindowsLiveWriter/UtiliserTortoiseSvnpourseconnecterCodePl_F03C/image_2.png"&gt;&lt;/a&gt;&lt;a href="http://blog.couzy.com/content/binary/WindowsLiveWriter/UtiliserTortoiseSvnpourseconnecterCodePl_F03C/image_6.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" border="0" alt="image" src="http://blog.couzy.com/content/binary/WindowsLiveWriter/UtiliserTortoiseSvnpourseconnecterCodePl_F03C/image_thumb_2.png" width="335" height="135"&gt;&lt;/a&gt;&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
Le port est ce que vous voulez de disponible sur votre machine, l'adresse du serveur
TFS est indiquée sur la page du projet CodePlex qui vous intéresse :
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://blog.couzy.com/content/binary/WindowsLiveWriter/UtiliserTortoiseSvnpourseconnecterCodePl_F03C/image_4.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" border="0" alt="image" src="http://blog.couzy.com/content/binary/WindowsLiveWriter/UtiliserTortoiseSvnpourseconnecterCodePl_F03C/image_thumb_1.png" width="597" height="284"&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;h2&gt;3/ Récupérez le code source 
&lt;/h2&gt;
&lt;p&gt;
Faites-vous un répertoire là où vous voulez une copie des sources, un clic droit,
et c'est tout : 
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://blog.couzy.com/content/binary/WindowsLiveWriter/UtiliserTortoiseSvnpourseconnecterCodePl_F03C/image_8.png"&gt;&lt;/a&gt;&lt;a href="http://blog.couzy.com/content/binary/WindowsLiveWriter/UtiliserTortoiseSvnpourseconnecterCodePl_F03C/image_10.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" border="0" alt="image" src="http://blog.couzy.com/content/binary/WindowsLiveWriter/UtiliserTortoiseSvnpourseconnecterCodePl_F03C/image_thumb_4.png" width="773" height="562"&gt;&lt;/a&gt;&amp;nbsp; 
&lt;/p&gt;
&lt;h2&gt;4/ Et pour les commits ?
&lt;/h2&gt;
&lt;p&gt;
Il vous faudra un compte avec les droits de mise à jour sur le projet. Attention,
le compte n'est pas directement votre login CodePlex : c'est &lt;strong&gt;snd\votreusername_cp&lt;/strong&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.couzy.com/aggbug.ashx?id=f5e23c0b-b2ba-45cc-a4bb-df79ec81d97e" /&gt;</description>
    </item>
    <item>
      <trackback:ping>http://blog.couzy.com/Trackback.aspx?guid=8ca7c79c-9b4c-4829-86ed-2f13e62b13cd</trackback:ping>
      <pingback:server>http://blog.couzy.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.couzy.com/PermaLink,guid,8ca7c79c-9b4c-4829-86ed-2f13e62b13cd.aspx</pingback:target>
      <dc:creator>Pierre Couzy</dc:creator>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Comme annoncé, voici quelques notes et réflexions sur l'implémentation de CardSpace
sans SSL
</p>
        <h2>
        </h2>
        <h2>Pour quelles utilisations ?
</h2>
        <p>
Lorsque vous allez sur un site Web utilisant Cardspace, il vous demande de choisir
une carte. Lorsque vous avez fait ce choix, un ensemble d'informations est transmis
au site Web (sous la forme d'un document XML). Si vous utilisez CardSpace sans SSL,
ces données transitent en clair entre le client et le serveur, et l'identité du serveur
n'est pas vérifiable. Pour ces raisons, vous ne pourrez échanger que des cartes auto-proclamées,
qui comportent un sous-ensemble des informations suivantes : 
</p>
        <ul>
          <li>
Identifiant unique sur le site concerné 
</li>
          <li>
Prénom 
</li>
          <li>
Nom 
</li>
          <li>
Email 
</li>
          <li>
Adresse (rue) 
</li>
          <li>
Adresse (Ville) 
</li>
          <li>
Adresse (Département/province) 
</li>
          <li>
Code Postal 
</li>
          <li>
Pays/Région 
</li>
          <li>
Téléphone 
</li>
          <li>
Téléphone 2 
</li>
          <li>
Téléphone mobile 
</li>
          <li>
Date de naissance 
</li>
          <li>
Sexe</li>
        </ul>
        <p>
En d'autres termes, vous pouvez pré-remplir une fiche utilisateur avec ces informations,
et reposer sur l'identifiant unique en remplacement d'un login/mot de passe. Ces informations
sont relativement peu sensibles et ne serviront pas à grand-chose si elles sont interceptées
pendant la communication avec le serveur. 
</p>
        <p>
En résumé : l'utilisation de CardSpace sans SSL est adaptée au login sur un site Web
ne manipulant pas d'informations sensibles sur votre compte.
</p>
        <h2>
        </h2>
        <h2>Que se passe-t-il lorsque j'utilise une carte personnelle sur un site Web ?
</h2>
        <p>
Au lieu d'utiliser une demande de login / mot de passe, le site Web vous demande d'envoyer
les informations vous concernant.
</p>
        <p>
Dans un premier temps, le site web vous demande de sélectionner une carte vous représentant,
et vous indique quelles sont les données qu'il va demander :
</p>
        <p>
          <img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="408" alt="image" src="http://blog.couzy.com/content/binary/WindowsLiveWriter/CardSpacesansSSLconsidrationsdimplmentat_10AE6/image_thumb_1.png" width="552" align="right" border="0" />Dans
cet exemple, le site a juste besoin de mon prénom (pour personnaliser les pages) et
de mon identifiant sur le site (pour remplacer un login et un mot de passe).
</p>
        <p>
Lorsque vous envoyez les données demandées, voici ce qui est transmis au site Web
:
</p>
        <p>
 
</p>
        <p>
 
</p>
        <p>
          <a href="http://blog.couzy.com/content/binary/WindowsLiveWriter/CardSpacesansSSLconsidrationsdimplmentat_10AE6/image_6.png">
            <img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="252" alt="image" src="http://blog.couzy.com/content/binary/WindowsLiveWriter/CardSpacesansSSLconsidrationsdimplmentat_10AE6/image_thumb_2.png" width="587" border="0" />
          </a>
        </p>
        <p>
Les données transmises sont manifestement très simples à décoder, puisqu'une requête
XPath donne directement accès aux informations voulues : 
</p>
        <pre class="csharpcode">
          <span class="kwrd">Public</span>
          <span class="kwrd">Function</span> RecupereAttribut(<span class="kwrd">ByVal</span> jeton <span class="kwrd">As</span><span class="kwrd">String</span>, <span class="kwrd">ByVal</span> claimName <span class="kwrd">As</span><span class="kwrd">String</span>) <span class="kwrd">As</span><span class="kwrd">String</span><span class="kwrd">Dim</span> x <span class="kwrd">As</span><span class="kwrd">New</span> System.Xml.XmlDocument()
x.LoadXml(jeton) <span class="kwrd">Dim</span> xns <span class="kwrd">As</span><span class="kwrd">New</span> XmlNamespaceManager(x.NameTable)
xns.AddNamespace(<span class="str">"saml"</span>, <span class="str">"urn:oasis:names:tc:SAML:1.0:assertion"</span>) <span class="kwrd">Dim</span> xn <span class="kwrd">As</span> System.Xml.XmlNode
xn = x.SelectSingleNode(<span class="str">"/saml:Assertion/saml:AttributeStatement/saml:Attribute[@AttributeName='"</span> &amp;
claimName &amp; <span class="str">"']"</span>, xns) <span class="kwrd">Return</span> xn.InnerText <span class="kwrd">End</span> Function</pre>
        <p>
Il y cependant quelques précautions à prendre pour garantir que personne ne pourra 
se faire passer pour un de vos utilisateurs.
</p>
        <p>
 
</p>
        <h2>Que doit faire un site Web quand vous lui envoyez vos informations ?
</h2>
        <p>
La première chose à faire est de vérifier que le XML envoyé n'a pas été modifié par
un utilisateur malveillant. Comme le document XML contient une balise &lt;Signature&gt;,
il suffit de vérifier que la signature correspond bien au document transmis. Voici
comment faire en VB.Net :
</p>
        <p>
 
</p>
        <pre class="csharpcode">
          <span class="kwrd">Public</span>
          <span class="kwrd">Function</span> JetonValide(<span class="kwrd">ByVal</span> token <span class="kwrd">As</span><span class="kwrd">String</span>) <span class="kwrd">As</span><span class="kwrd">Boolean</span><span class="rem">'
charger le jeton</span><span class="kwrd">Dim</span> x <span class="kwrd">As</span><span class="kwrd">New</span> XmlDocument()
x.LoadXml(token) <span class="kwrd">Dim</span> s <span class="kwrd">As</span><span class="kwrd">New</span> SamlSignedXml(x) <span class="rem">'
renseigner les namespaces</span><span class="kwrd">Dim</span> xns <span class="kwrd">As</span><span class="kwrd">New</span> XmlNamespaceManager(x.NameTable)
xns.AddNamespace(<span class="str">"sig"</span>, <span class="str">"http://www.w3.org/2000/09/xmldsig#"</span>) <span class="rem">'vérifier
la signature</span> s.LoadXml(x.SelectSingleNode(<span class="str">"//sig:Signature"</span>,
xns)) <span class="kwrd">Return</span> s.CheckSignature <span class="kwrd">End</span><span class="kwrd">Function</span></pre>
        <style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
        <p>
 
</p>
        <p>
Ce code repose sur une classe SamlSignedXml qui est *presque* fournie par le Framework
.Net (voir code source joint à la fin de cet article). Si vous n'êtes pas en .Net
sur votre serveur Web il vous suffit de trouver un bout de code vérifiant une signature
XML.
</p>
        <p>
 
</p>
        <p>
          <a href="http://blog.couzy.com/content/binary/WindowsLiveWriter/CardSpacesansSSLconsidrationsdimplmentat_10AE6/image_8.png">
            <img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="268" alt="image" src="http://blog.couzy.com/content/binary/WindowsLiveWriter/CardSpacesansSSLconsidrationsdimplmentat_10AE6/image_thumb_3.png" width="390" align="right" border="0" />
          </a>
        </p>
        <p>
Une fois que vous êtes certain que le document XML n'a pas été modifié avant d'arriver
sur le serveur, vous allez en extraire l'identifiant utilisateur qui remplace le login
/ mot de passe. Cet identifiant est en fait composé de deux parties : d'une part l'information
PrivatePersonalIdentifier transmise dans le document XML, et l'information Modulus
qui garantit que l'information vient bien du bon utilisateur. Pour ne pas avoir à
stocker deux informations distinctes, le plus simple est de les combiner et d'en faire
votre identifiant utilisateur : 
</p>
        <p>
 
</p>
        <pre class="csharpcode">
          <span class="kwrd">Public</span>
          <span class="kwrd">Function</span> IDUtilisateur(<span class="kwrd">ByVal</span> jeton <span class="kwrd">As</span><span class="kwrd">String</span>) <span class="kwrd">As</span><span class="kwrd">String</span><span class="rem">'
Récupération du PPID</span><span class="kwrd">Dim</span> PPID <span class="kwrd">As</span><span class="kwrd">String</span> =
RecupereAttribut(jeton, <span class="str">"privatepersonalidentifier"</span>) <span class="rem">'
Récupération de la clé</span><span class="kwrd">Dim</span> x <span class="kwrd">As</span><span class="kwrd">New</span> XmlDocument()
x.LoadXml(jeton) <span class="kwrd">Dim</span> xns <span class="kwrd">As</span><span class="kwrd">New</span> XmlNamespaceManager(x.NameTable)
xns.AddNamespace(<span class="str">"sig"</span>, <span class="str">"http://www.w3.org/2000/09/xmldsig#"</span>) <span class="kwrd">Dim</span> ClePublique <span class="kwrd">As</span><span class="kwrd">String</span> =
x.SelectSingleNode(<span class="str">"//sig:Modulus"</span>, xns).InnerText <span class="rem">'Combinaison
des deux données en une seule</span><span class="kwrd">Dim</span> hacheur <span class="kwrd">As</span> SHA1
= SHA1.Create(<span class="str">"SHA1"</span>) <span class="kwrd">Dim</span> OctetsPPID() <span class="kwrd">As</span><span class="kwrd">Byte</span> =
Convert.FromBase64String(PPID) <span class="kwrd">Dim</span> OctetsCle() <span class="kwrd">As</span><span class="kwrd">Byte</span> =
Convert.FromBase64String(ClePublique) <span class="kwrd">Dim</span> OctetsAHacher(OctetsPPID.Length
+ OctetsCle.Length) <span class="kwrd">As</span><span class="kwrd">Byte</span> OctetsPPID.CopyTo(OctetsAHacher,
0) OctetsCle.CopyTo(OctetsAHacher, OctetsPPID.Length) <span class="rem">'Transformation
en chaine de caractères</span><span class="kwrd">Return</span> Convert.ToBase64String(hacheur.ComputeHash(OctetsAHacher)) <span class="kwrd">End</span><span class="kwrd">Function</span></pre>
        <p>
 
</p>
        <h2>Et pour les plus flemmards...
</h2>
        <p>
Vous trouverez dans CardSpaceSansSSL.Zip 4 fichiers :
</p>
        <p>
PageNormale.html et ic_image.jpg : l'image et l'exemple de code HTML nécessaires pour
utiliser Cardspace sur n'importe quel site.
</p>
        <p>
decodejeton.aspx et decodejeton.aspx.vb : une page de test qui affiche les informations
transmises après avoir vérifié leur validité.
</p>
        <a href="http://blog.couzy.com/content/binary/CardSpaceSansSSL.zip">CardSpaceSansSSL.zip
(9,74 KB)</a>
        <img width="0" height="0" src="http://blog.couzy.com/aggbug.ashx?id=8ca7c79c-9b4c-4829-86ed-2f13e62b13cd" />
      </body>
      <title>CardSpace sans SSL : consid&amp;eacute;rations d'impl&amp;eacute;mentation</title>
      <guid isPermaLink="false">http://blog.couzy.com/PermaLink,guid,8ca7c79c-9b4c-4829-86ed-2f13e62b13cd.aspx</guid>
      <link>http://blog.couzy.com/PermaLink,guid,8ca7c79c-9b4c-4829-86ed-2f13e62b13cd.aspx</link>
      <pubDate>Tue, 11 Mar 2008 18:19:42 GMT</pubDate>
      <description>&lt;p&gt;
Comme annoncé, voici quelques notes et réflexions sur l'implémentation de CardSpace
sans SSL
&lt;/p&gt;
&lt;h2&gt;
&lt;/h2&gt;
&lt;h2&gt;Pour quelles utilisations ?
&lt;/h2&gt;
&lt;p&gt;
Lorsque vous allez sur un site Web utilisant Cardspace, il vous demande de choisir
une carte. Lorsque vous avez fait ce choix, un ensemble d'informations est transmis
au site Web (sous la forme d'un document XML). Si vous utilisez CardSpace sans SSL,
ces données transitent en clair entre le client et le serveur, et l'identité du serveur
n'est pas vérifiable. Pour ces raisons, vous ne pourrez échanger que des cartes auto-proclamées,
qui comportent un sous-ensemble des informations suivantes : 
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Identifiant unique sur le site concerné 
&lt;li&gt;
Prénom 
&lt;li&gt;
Nom 
&lt;li&gt;
Email 
&lt;li&gt;
Adresse (rue) 
&lt;li&gt;
Adresse (Ville) 
&lt;li&gt;
Adresse (Département/province) 
&lt;li&gt;
Code Postal 
&lt;li&gt;
Pays/Région 
&lt;li&gt;
Téléphone 
&lt;li&gt;
Téléphone 2 
&lt;li&gt;
Téléphone mobile 
&lt;li&gt;
Date de naissance 
&lt;li&gt;
Sexe&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
En d'autres termes, vous pouvez pré-remplir une fiche utilisateur avec ces informations,
et reposer sur l'identifiant unique en remplacement d'un login/mot de passe. Ces informations
sont relativement peu sensibles et ne serviront pas à grand-chose si elles sont interceptées
pendant la communication avec le serveur. 
&lt;/p&gt;
&lt;p&gt;
En résumé : l'utilisation de CardSpace sans SSL est adaptée au login sur un site Web
ne manipulant pas d'informations sensibles sur votre compte.
&lt;/p&gt;
&lt;h2&gt;
&lt;/h2&gt;
&lt;h2&gt;Que se passe-t-il lorsque j'utilise une carte personnelle sur un site Web ?
&lt;/h2&gt;
&lt;p&gt;
Au lieu d'utiliser une demande de login / mot de passe, le site Web vous demande d'envoyer
les informations vous concernant.
&lt;/p&gt;
&lt;p&gt;
Dans un premier temps, le site web vous demande de sélectionner une carte vous représentant,
et vous indique quelles sont les données qu'il va demander :
&lt;/p&gt;
&lt;p&gt;
&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="408" alt="image" src="http://blog.couzy.com/content/binary/WindowsLiveWriter/CardSpacesansSSLconsidrationsdimplmentat_10AE6/image_thumb_1.png" width="552" align="right" border="0"&gt;Dans
cet exemple, le site a juste besoin de mon prénom (pour personnaliser les pages) et
de mon identifiant sur le site (pour remplacer un login et un mot de passe).
&lt;/p&gt;
&lt;p&gt;
Lorsque vous envoyez les données demandées, voici ce qui est transmis au site Web
:
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://blog.couzy.com/content/binary/WindowsLiveWriter/CardSpacesansSSLconsidrationsdimplmentat_10AE6/image_6.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="252" alt="image" src="http://blog.couzy.com/content/binary/WindowsLiveWriter/CardSpacesansSSLconsidrationsdimplmentat_10AE6/image_thumb_2.png" width="587" border="0"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Les données transmises sont manifestement très simples à décoder, puisqu'une requête
XPath donne directement accès aux informations voulues : 
&lt;/p&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;Public&lt;/span&gt; &lt;span class="kwrd"&gt;Function&lt;/span&gt; RecupereAttribut(&lt;span class="kwrd"&gt;ByVal&lt;/span&gt; jeton &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;String&lt;/span&gt;, &lt;span class="kwrd"&gt;ByVal&lt;/span&gt; claimName &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;String&lt;/span&gt;) &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;String&lt;/span&gt; &lt;span class="kwrd"&gt;Dim&lt;/span&gt; x &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;New&lt;/span&gt; System.Xml.XmlDocument()
x.LoadXml(jeton) &lt;span class="kwrd"&gt;Dim&lt;/span&gt; xns &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;New&lt;/span&gt; XmlNamespaceManager(x.NameTable)
xns.AddNamespace(&lt;span class="str"&gt;"saml"&lt;/span&gt;, &lt;span class="str"&gt;"urn:oasis:names:tc:SAML:1.0:assertion"&lt;/span&gt;) &lt;span class="kwrd"&gt;Dim&lt;/span&gt; xn &lt;span class="kwrd"&gt;As&lt;/span&gt; System.Xml.XmlNode
xn = x.SelectSingleNode(&lt;span class="str"&gt;"/saml:Assertion/saml:AttributeStatement/saml:Attribute[@AttributeName='"&lt;/span&gt; &amp;amp;
claimName &amp;amp; &lt;span class="str"&gt;"']"&lt;/span&gt;, xns) &lt;span class="kwrd"&gt;Return&lt;/span&gt; xn.InnerText &lt;span class="kwrd"&gt;End&lt;/span&gt; Function&lt;/pre&gt;
&lt;p&gt;
Il y cependant quelques précautions à prendre pour garantir que personne ne pourra&amp;nbsp;
se faire passer pour un de vos utilisateurs.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;h2&gt;Que doit faire un site Web quand vous lui envoyez vos informations ?
&lt;/h2&gt;
&lt;p&gt;
La première chose à faire est de vérifier que le XML envoyé n'a pas été modifié par
un utilisateur malveillant. Comme le document XML contient une balise &amp;lt;Signature&amp;gt;,
il suffit de vérifier que la signature correspond bien au document transmis. Voici
comment faire en VB.Net :
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;Public&lt;/span&gt; &lt;span class="kwrd"&gt;Function&lt;/span&gt; JetonValide(&lt;span class="kwrd"&gt;ByVal&lt;/span&gt; token &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;String&lt;/span&gt;) &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;Boolean&lt;/span&gt; &lt;span class="rem"&gt;'
charger le jeton&lt;/span&gt; &lt;span class="kwrd"&gt;Dim&lt;/span&gt; x &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;New&lt;/span&gt; XmlDocument()
x.LoadXml(token) &lt;span class="kwrd"&gt;Dim&lt;/span&gt; s &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;New&lt;/span&gt; SamlSignedXml(x) &lt;span class="rem"&gt;'
renseigner les namespaces&lt;/span&gt; &lt;span class="kwrd"&gt;Dim&lt;/span&gt; xns &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;New&lt;/span&gt; XmlNamespaceManager(x.NameTable)
xns.AddNamespace(&lt;span class="str"&gt;"sig"&lt;/span&gt;, &lt;span class="str"&gt;"http://www.w3.org/2000/09/xmldsig#"&lt;/span&gt;) &lt;span class="rem"&gt;'vérifier
la signature&lt;/span&gt; s.LoadXml(x.SelectSingleNode(&lt;span class="str"&gt;"//sig:Signature"&lt;/span&gt;,
xns)) &lt;span class="kwrd"&gt;Return&lt;/span&gt; s.CheckSignature &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;Function&lt;/span&gt; &lt;/pre&gt;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Ce code repose sur une classe SamlSignedXml qui est *presque* fournie par le Framework
.Net (voir code source joint à la fin de cet article). Si vous n'êtes pas en .Net
sur votre serveur Web il vous suffit de trouver un bout de code vérifiant une signature
XML.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://blog.couzy.com/content/binary/WindowsLiveWriter/CardSpacesansSSLconsidrationsdimplmentat_10AE6/image_8.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="268" alt="image" src="http://blog.couzy.com/content/binary/WindowsLiveWriter/CardSpacesansSSLconsidrationsdimplmentat_10AE6/image_thumb_3.png" width="390" align="right" border="0"&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
Une fois que vous êtes certain que le document XML n'a pas été modifié avant d'arriver
sur le serveur, vous allez en extraire l'identifiant utilisateur qui remplace le login
/ mot de passe. Cet identifiant est en fait composé de deux parties : d'une part l'information
PrivatePersonalIdentifier transmise dans le document XML, et l'information Modulus
qui garantit que l'information vient bien du bon utilisateur. Pour ne pas avoir à
stocker deux informations distinctes, le plus simple est de les combiner et d'en faire
votre identifiant utilisateur : 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;Public&lt;/span&gt; &lt;span class="kwrd"&gt;Function&lt;/span&gt; IDUtilisateur(&lt;span class="kwrd"&gt;ByVal&lt;/span&gt; jeton &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;String&lt;/span&gt;) &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;String&lt;/span&gt; &lt;span class="rem"&gt;'
Récupération du PPID&lt;/span&gt; &lt;span class="kwrd"&gt;Dim&lt;/span&gt; PPID &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;String&lt;/span&gt; =
RecupereAttribut(jeton, &lt;span class="str"&gt;"privatepersonalidentifier"&lt;/span&gt;) &lt;span class="rem"&gt;'
Récupération de la clé&lt;/span&gt; &lt;span class="kwrd"&gt;Dim&lt;/span&gt; x &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;New&lt;/span&gt; XmlDocument()
x.LoadXml(jeton) &lt;span class="kwrd"&gt;Dim&lt;/span&gt; xns &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;New&lt;/span&gt; XmlNamespaceManager(x.NameTable)
xns.AddNamespace(&lt;span class="str"&gt;"sig"&lt;/span&gt;, &lt;span class="str"&gt;"http://www.w3.org/2000/09/xmldsig#"&lt;/span&gt;) &lt;span class="kwrd"&gt;Dim&lt;/span&gt; ClePublique &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;String&lt;/span&gt; =
x.SelectSingleNode(&lt;span class="str"&gt;"//sig:Modulus"&lt;/span&gt;, xns).InnerText &lt;span class="rem"&gt;'Combinaison
des deux données en une seule&lt;/span&gt; &lt;span class="kwrd"&gt;Dim&lt;/span&gt; hacheur &lt;span class="kwrd"&gt;As&lt;/span&gt; SHA1
= SHA1.Create(&lt;span class="str"&gt;"SHA1"&lt;/span&gt;) &lt;span class="kwrd"&gt;Dim&lt;/span&gt; OctetsPPID() &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;Byte&lt;/span&gt; =
Convert.FromBase64String(PPID) &lt;span class="kwrd"&gt;Dim&lt;/span&gt; OctetsCle() &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;Byte&lt;/span&gt; =
Convert.FromBase64String(ClePublique) &lt;span class="kwrd"&gt;Dim&lt;/span&gt; OctetsAHacher(OctetsPPID.Length
+ OctetsCle.Length) &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;Byte&lt;/span&gt; OctetsPPID.CopyTo(OctetsAHacher,
0) OctetsCle.CopyTo(OctetsAHacher, OctetsPPID.Length) &lt;span class="rem"&gt;'Transformation
en chaine de caractères&lt;/span&gt; &lt;span class="kwrd"&gt;Return&lt;/span&gt; Convert.ToBase64String(hacheur.ComputeHash(OctetsAHacher)) &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;Function&lt;/span&gt; &lt;/pre&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;h2&gt;Et pour les plus flemmards...
&lt;/h2&gt;
&lt;p&gt;
Vous trouverez dans CardSpaceSansSSL.Zip 4 fichiers :
&lt;/p&gt;
&lt;p&gt;
PageNormale.html et ic_image.jpg : l'image et l'exemple de code HTML nécessaires pour
utiliser Cardspace sur n'importe quel site.
&lt;/p&gt;
&lt;p&gt;
decodejeton.aspx et decodejeton.aspx.vb : une page de test qui affiche les informations
transmises après avoir vérifié leur validité.
&lt;/p&gt;
&lt;a href="http://blog.couzy.com/content/binary/CardSpaceSansSSL.zip"&gt;CardSpaceSansSSL.zip
(9,74 KB)&lt;/a&gt;&lt;img width="0" height="0" src="http://blog.couzy.com/aggbug.ashx?id=8ca7c79c-9b4c-4829-86ed-2f13e62b13cd" /&gt;</description>
    </item>
    <item>
      <trackback:ping>http://blog.couzy.com/Trackback.aspx?guid=01192b04-0692-4cd2-9967-9e85227824e3</trackback:ping>
      <pingback:server>http://blog.couzy.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.couzy.com/PermaLink,guid,01192b04-0692-4cd2-9967-9e85227824e3.aspx</pingback:target>
      <dc:creator>Pierre Couzy</dc:creator>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Avec la sortie de .Net 3.5, le sélecteur d'identité CardSpace est utilisable sur des
sites ne disposant pas de SSL. 
</p>
        <p>
Cette modification se traduit techniquement par une modification du format des jetons
transmis au site Web de destination. Au lieu d'être chiffré avec la clé publique du
serveur Web, il transite en clair.
</p>
        <p>
 
</p>
        <p>
On ne perd pas pour autant toute forme de sécurité : le jeton est toujours signé avec
une clé privée connue uniquement du sélecteur d'identité, clé qui change pour chaque
site Web. 
</p>
        <p>
 
</p>
        <p>
Le travail du site Web est par contre considérablement simplifié : il ne reste plus
qu'à vérifier la signature du jeton avant de pouvoir le manipuler. 
</p>
        <p>
 
</p>
        <p>
Vous pouvez tester dès aujourd'hui sur <a href="http://bridge2.grognon.com/">http://bridge2.grognon.com/</a>,
et je posterai prochainement le code du sample.
</p>
        <img width="0" height="0" src="http://blog.couzy.com/aggbug.ashx?id=01192b04-0692-4cd2-9967-9e85227824e3" />
      </body>
      <title>CardSpace sans SSL ?</title>
      <guid isPermaLink="false">http://blog.couzy.com/PermaLink,guid,01192b04-0692-4cd2-9967-9e85227824e3.aspx</guid>
      <link>http://blog.couzy.com/PermaLink,guid,01192b04-0692-4cd2-9967-9e85227824e3.aspx</link>
      <pubDate>Sun, 10 Feb 2008 22:09:01 GMT</pubDate>
      <description>&lt;p&gt;
Avec la sortie de .Net 3.5, le sélecteur d'identité CardSpace est utilisable sur des
sites ne disposant pas de SSL. 
&lt;/p&gt;
&lt;p&gt;
Cette modification se traduit techniquement par une modification du format des jetons
transmis au site Web de destination. Au lieu d'être chiffré avec la clé publique du
serveur Web, il transite en clair.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
On ne perd pas pour autant toute forme de sécurité : le jeton est toujours signé avec
une clé privée connue uniquement du sélecteur d'identité, clé qui change pour chaque
site Web. 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Le travail du site Web est par contre considérablement simplifié : il ne reste plus
qu'à vérifier la signature du jeton avant de pouvoir le manipuler. 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Vous pouvez tester dès aujourd'hui sur &lt;a href="http://bridge2.grognon.com/"&gt;http://bridge2.grognon.com/&lt;/a&gt;,
et je posterai prochainement le code du sample.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.couzy.com/aggbug.ashx?id=01192b04-0692-4cd2-9967-9e85227824e3" /&gt;</description>
    </item>
    <item>
      <trackback:ping>http://blog.couzy.com/Trackback.aspx?guid=4092feab-d315-4d00-b19a-7cd52c47aafe</trackback:ping>
      <pingback:server>http://blog.couzy.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.couzy.com/PermaLink,guid,4092feab-d315-4d00-b19a-7cd52c47aafe.aspx</pingback:target>
      <dc:creator>Pierre Couzy</dc:creator>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <h3>
        </h3>
        <p>
Si vous avez regardé une démonstration ou deux sur Cardspace vous avez probablement
été conquis par la technologie et vous voudriez l’expérimenter un peu. Ce tutorial
vous explique comment configurer tous les éléments nécessaires au développement Cardspace sous
Windows Vista FR. 
</p>
        <p>
Pour Windows 2003 ou Windows XP la démarche est identique, j’explique les différences
les plus importantes au fur et à mesure de l’article. 
</p>
        <p>
Je ne rentrerai pas dans le détail de l’installation de Visual Studio ou Visual Web
developer dans ce pas à pas. Sachez simplement que pour bien fonctionner sous Vista
vous devrez installer le SP1 puis un patch (l’adresse est donnée lors du lancement
de Visual Studio SP1, ainsi que les conseils d’utilisation). Il vous faudra également
sous XP ou 2003 installer .Net 3.0 et IE7. 
</p>
        <h2>Installation d’IIS sous Vista
</h2>
        <p>
Allez dans le panneau de configuration, dans la zone Programmes, et sélectionnez « Activer
ou désactiver des fonctionnalités Windows ». 
</p>
        <p>
          <img height="498" src="http://blog.couzy.com/content/binary/WindowsLiveWriter/PrparerunemachinepourdudveloppementCardS_FAC1/clip_image002.jpg" width="464" />
        </p>
        <p>
          <b>N’oubliez pas d’activer les options de compatibilité IIS6, Visual Web Express en
aura besoin pour se connecter au site web local</b>. 
</p>
        <p>
Lancer ensuite un command prompt en mode administrateur, et enregistrez ASP.Net : 
</p>
        <p>
          <img height="578" src="http://blog.couzy.com/content/binary/WindowsLiveWriter/PrparerunemachinepourdudveloppementCardS_FAC1/clip_image004.jpg" width="480" />
        </p>
        <p>
          <img height="302" src="http://blog.couzy.com/content/binary/WindowsLiveWriter/PrparerunemachinepourdudveloppementCardS_FAC1/clip_image006.jpg" width="605" />
        </p>
        <h4>Génération et installation du certificat SSL.
</h4>
        <p>
A moins de déjà disposer d’un certificat SSL, vous voudrez certainement générer un
certificat de test. La solution la plus simple consiste à télécharger le Kit de ressources
d’IIS 6 (fonctionne pour Vista, 2003, et longhorn server), que vous trouverez en faisant
une recherche sur « IIS Resource Kit ». Lors de l’installation du kit, demandez
uniquement l’installation de SelfSSL. 
</p>
        <p>
Relancez un command prompt en mode administrateur et générez votre certificat : 
</p>
        <p>
          <img height="413" src="http://blog.couzy.com/content/binary/WindowsLiveWriter/PrparerunemachinepourdudveloppementCardS_FAC1/clip_image008.jpg" width="604" />
        </p>
        <p>
La commande à exécuter est en surbrillance, pour les amateurs de copier/coller il
s’agit de 
<br /><b></b><b>SelfSSL /N:CN=www.test.com /V:3650 </b></p>
        <p>
          <b>Nota bene pour les utilisateurs de XP : </b>
        </p>
        <p>
Cette étape de génération de certificat est plus délicate sous Windows XP, SelfSSL
n’étant pas disponible. Sans entrer dans les détails, voici les principaux écueils
à franchir : 
</p>
        <p>
1/ Récupérez l’exécutable MakeCert dans les SDKs 
</p>
        <p>
2/ Générez un certificat avec la commande barbare suivante : 
</p>
        <p>
makecert.exe -a SHA1 -ss my -sr LocalMachine -n "CN=www.test.com" -b 01/01/2000 -e
01/01/2050  -eku 1.3.6.1.5.5.7.3.1 -sky exchange  -sp "Microsoft RSA SChannel
Cryptographic Provider" -sy 12 
</p>
        <p>
3/ Allez dans les propriétés de votre serveur Web, dans l’onglet sécurité, et attribuez
le certificat à votre site. Vous êtes maintenant arrivés au même point que les utilisateurs
de 2003 ou Vista. 
</p>
        <p>
          <b>Post scriptum de nota bene </b>
        </p>
        <p>
Je tiens à présenter toutes mes excuses aux légitimes détenteurs du domaine test.com
pour distraire d'honnêtes développeurs d'un site probablement plein d'intérêt. 
</p>
        <h2>Modification du fichier Hosts
</h2>
        <p>
Pour que votre certificat soit reconnu, vous devrez faire pointer le site <a href="http://www.test.com/">http://www.test.com/</a> sur
votre machine de développement. Pour ce faire, il vous faudra modifier le fichier
HOSTS situé dans 
</p>
        <p>
          <b>C:\windows\system32\drivers\etc</b>
        </p>
        <p>
ATTENTION : il s’agit d’un fichier protégé, il est donc impératif de lancer Notepad
en tant qu’administrateur si vous voulez le modifier. 
</p>
        <p>
          <img height="360" src="http://blog.couzy.com/content/binary/WindowsLiveWriter/PrparerunemachinepourdudveloppementCardS_FAC1/clip_image010.jpg" width="604" border="0" />
        </p>
        <p>
Lancez un navigateur et allez sur <a href="https://www.test.com/">https://www.test.com/</a></p>
        <p>
          <img height="340" src="http://blog.couzy.com/content/binary/WindowsLiveWriter/PrparerunemachinepourdudveloppementCardS_FAC1/clip_image012.jpg" width="604" border="0" />
        </p>
        <p>
Comme le certificat n’a pas été délivré par une autorité de confiance, IE nous bloque.
Nous allons remédier à cela. 
</p>
        <p>
1/ Lancez une console d’administration (en tapant mmc) 
</p>
        <p>
2/ Dans le menu Fichier, demandez l’ajout d’un composant enfichable. Dans la liste
qui apparaît, double-cliquez sur Certificats et choisissez Compte de l’ordinateur
dans la boite de dialogue qui apparaît. 
</p>
        <p>
3/ Vous devriez maintenant pouvoir accéder au certificat que vous venez de générer : 
</p>
        <p>
          <img height="448" src="http://blog.couzy.com/content/binary/WindowsLiveWriter/PrparerunemachinepourdudveloppementCardS_FAC1/clip_image014.jpg" width="605" border="0" />
        </p>
        <p>
          <b>
          </b>
        </p>
        <p>
          <b>Copiez maintenant ce certificat dans les certificats des Autorités de certification
racine</b>. De cette façon ce certificat sera considéré comme valide par Internet
Explorer. Rafraichissez maintenant IE, vous devriez parvenir au résultat escompté : 
</p>
        <p>
          <img height="520" src="http://blog.couzy.com/content/binary/WindowsLiveWriter/PrparerunemachinepourdudveloppementCardS_FAC1/clip_image016.jpg" width="605" border="0" />
        </p>
        <h4>Paramétrage du certificat pour CardSpace.
</h4>
        <p>
Il nous reste une dernière manipulation à effectuer : notre application Web aura
tôt ou tard besoin de lire la clé privée du certificat que nous venons de générer.
Par défaut, cette clé est protégée et aucune application Web ne peut s’en servir directement.
Il existe des méthodes plus élégantes que celle que je vais vous donner maintenant,
mais elles demandent des outils supplémentaires. 
</p>
        <p>
Relancer un command prompt en mode administrateur<b></b>et rendez-vous dans le répertoire <b>\ProgramData\Microsoft\Crypto\RSA\MachineKeys</b></p>
        <p>
Puis tapez <b>Explorer .</b> (n’oubliez pas le point) 
</p>
        <p>
Si aucun fichier n’apparaît modifiez vos options d’affichage pour voir les fichiers
système. 
</p>
        <p>
(nota : le chemin pour XP/2003 est <b>C:\Documents and Settings\All Users\Application
Data\Microsoft\Crypto\RSA\MachineKeys</b>) 
</p>
        <p>
          <b>
            <img height="453" src="http://blog.couzy.com/content/binary/WindowsLiveWriter/PrparerunemachinepourdudveloppementCardS_FAC1/clip_image018.jpg" width="605" border="0" />
          </b>
        </p>
        <p>
Sélectionnez maintenant le fichier le plus récent (il représente le certificat que
vous venez d’ajouter), et modifiez sa sécurité pour donner au compte SERVICE RÉSEAU
les droits de lecture sur le fichier. 
</p>
        <p>
          <img height="516" src="http://blog.couzy.com/content/binary/WindowsLiveWriter/PrparerunemachinepourdudveloppementCardS_FAC1/clip_image020.jpg" width="604" border="0" />
        </p>
        <p>
Attention, le compte est bien SERVICE RÉSEAU avec un é en majuscules (faites un copier/coller
depuis cet article si vous ne savez pas faire un É avec votre clavier). Il s’agit
du compte qui fait tourner votre site web, vous pouvez bien sûr le modifier en allant
dans la console d’administration d’IIS. 
</p>
        <p>
(nota : sous XP le compte est probablement ASPNET) 
</p>
        <h4>Tester l’installation
</h4>
        <p>
Placez le fichier test.aspx dans c:\inetpub\wwwroot et naviguez sur <a href="https://www.test.com/test.aspx">https://www.test.com/test.aspx</a></p>
        <p>
          <img height="404" src="http://blog.couzy.com/content/binary/WindowsLiveWriter/PrparerunemachinepourdudveloppementCardS_FAC1/clip_image022.jpg" width="605" border="0" />
        </p>
        <p>
Le bouton Déclencher le sélecteur devrait faire apparaître le sélecteur d’identité
où vous pourrez sélectionner une carte personnelle. 
</p>
        <p>
          <img height="440" src="http://blog.couzy.com/content/binary/WindowsLiveWriter/PrparerunemachinepourdudveloppementCardS_FAC1/clip_image024.jpg" width="605" border="0" />
        </p>
        <p>
Elle servira à générer un jeton chiffré consultable dans la textbox (enfin, vous n’apprendrez
pas grand-chose puisqu’il est chiffré) ? Le bouton Envoyer au serveur déclenchera
le décodage du jeton et l’affichage de son contenu. 
</p>
        <p>
          <img height="421" src="http://blog.couzy.com/content/binary/WindowsLiveWriter/PrparerunemachinepourdudveloppementCardS_FAC1/clip_image026.jpg" width="605" border="0" />
        </p>
        <p>
          <img height="421" src="http://blog.couzy.com/content/binary/WindowsLiveWriter/PrparerunemachinepourdudveloppementCardS_FAC1/clip_image028.jpg" width="605" border="0" />
        </p>
        <a href="http://blog.couzy.com/content/binary/test.zip">test.zip (5,73 KB)</a>
        <img width="0" height="0" src="http://blog.couzy.com/aggbug.ashx?id=4092feab-d315-4d00-b19a-7cd52c47aafe" />
      </body>
      <title>Pr&amp;eacute;parer une machine pour du d&amp;eacute;veloppement CardSpace</title>
      <guid isPermaLink="false">http://blog.couzy.com/PermaLink,guid,4092feab-d315-4d00-b19a-7cd52c47aafe.aspx</guid>
      <link>http://blog.couzy.com/PermaLink,guid,4092feab-d315-4d00-b19a-7cd52c47aafe.aspx</link>
      <pubDate>Tue, 10 Apr 2007 15:50:26 GMT</pubDate>
      <description>&lt;h3&gt;
&lt;/h3&gt;
&lt;p&gt;
Si vous avez regardé une démonstration ou deux sur Cardspace vous avez probablement
été conquis par la technologie et vous voudriez l’expérimenter un peu. Ce tutorial
vous explique comment configurer tous les éléments nécessaires au développement Cardspace&amp;nbsp;sous
Windows Vista FR. 
&lt;p&gt;
Pour Windows 2003 ou Windows XP la démarche est identique, j’explique les différences
les plus importantes au fur et à mesure de l’article. 
&lt;p&gt;
Je ne rentrerai pas dans le détail de l’installation de Visual Studio ou Visual Web
developer dans ce pas à pas. Sachez simplement que pour bien fonctionner sous Vista
vous devrez installer le SP1 puis un patch (l’adresse est donnée lors du lancement
de Visual Studio SP1, ainsi que les conseils d’utilisation). Il vous faudra également
sous XP ou 2003 installer .Net 3.0 et IE7. 
&lt;h2&gt;Installation d’IIS sous Vista
&lt;/h2&gt;
&lt;p&gt;
Allez dans le panneau de configuration, dans la zone Programmes, et sélectionnez «&amp;nbsp;Activer
ou désactiver des fonctionnalités Windows&amp;nbsp;». 
&lt;p&gt;
&lt;img height=498 src="http://blog.couzy.com/content/binary/WindowsLiveWriter/PrparerunemachinepourdudveloppementCardS_FAC1/clip_image002.jpg" width=464&gt; 
&lt;p&gt;
&lt;b&gt;N’oubliez pas d’activer les options de compatibilité IIS6, Visual Web Express en
aura besoin pour se connecter au site web local&lt;/b&gt;. 
&lt;p&gt;
Lancer ensuite un command prompt en mode administrateur, et enregistrez ASP.Net&amp;nbsp;: 
&lt;p&gt;
&lt;img height=578 src="http://blog.couzy.com/content/binary/WindowsLiveWriter/PrparerunemachinepourdudveloppementCardS_FAC1/clip_image004.jpg" width=480&gt; 
&lt;p&gt;
&lt;img height=302 src="http://blog.couzy.com/content/binary/WindowsLiveWriter/PrparerunemachinepourdudveloppementCardS_FAC1/clip_image006.jpg" width=605&gt; 
&lt;h4&gt;Génération et installation du certificat SSL.
&lt;/h4&gt;
&lt;p&gt;
A moins de déjà disposer d’un certificat SSL, vous voudrez certainement générer un
certificat de test. La solution la plus simple consiste à télécharger le Kit de ressources
d’IIS 6 (fonctionne pour Vista, 2003, et longhorn server), que vous trouverez en faisant
une recherche sur «&amp;nbsp;IIS Resource Kit&amp;nbsp;». Lors de l’installation du kit, demandez
uniquement l’installation de SelfSSL. 
&lt;p&gt;
Relancez un command prompt en mode administrateur et générez votre certificat&amp;nbsp;: 
&lt;p&gt;
&lt;img height=413 src="http://blog.couzy.com/content/binary/WindowsLiveWriter/PrparerunemachinepourdudveloppementCardS_FAC1/clip_image008.jpg" width=604&gt; 
&lt;p&gt;
La commande à exécuter est en surbrillance, pour les amateurs de copier/coller il
s’agit de 
&lt;br&gt;
&lt;b&gt;&lt;/b&gt;&lt;b&gt;SelfSSL /N:CN=www.test.com /V:3650 &lt;/b&gt; 
&lt;p&gt;
&lt;b&gt;Nota bene&amp;nbsp;pour les utilisateurs de XP : &lt;/b&gt; 
&lt;p&gt;
Cette étape de génération de certificat est plus délicate sous Windows XP, SelfSSL
n’étant pas disponible. Sans entrer dans les détails, voici les principaux écueils
à franchir&amp;nbsp;: 
&lt;p&gt;
1/ Récupérez l’exécutable MakeCert dans les SDKs 
&lt;p&gt;
2/ Générez un certificat avec la commande barbare suivante&amp;nbsp;: 
&lt;p&gt;
makecert.exe -a SHA1 -ss my -sr LocalMachine -n "CN=www.test.com" -b 01/01/2000 -e
01/01/2050&amp;nbsp; -eku 1.3.6.1.5.5.7.3.1 -sky exchange&amp;nbsp; -sp "Microsoft RSA SChannel
Cryptographic Provider" -sy 12 
&lt;p&gt;
3/ Allez dans les propriétés de votre serveur Web, dans l’onglet sécurité, et attribuez
le certificat à votre site. Vous êtes maintenant arrivés au même point que les utilisateurs
de 2003 ou Vista. 
&lt;p&gt;
&lt;b&gt;Post scriptum de nota bene &lt;/b&gt; 
&lt;p&gt;
Je tiens à présenter toutes mes excuses aux légitimes détenteurs du domaine test.com
pour distraire d'honnêtes développeurs d'un site probablement plein d'intérêt. 
&lt;h2&gt;Modification du fichier Hosts
&lt;/h2&gt;
&lt;p&gt;
Pour que votre certificat soit reconnu, vous devrez faire pointer le site &lt;a href="http://www.test.com/"&gt;http://www.test.com/&lt;/a&gt; sur
votre machine de développement. Pour ce faire, il vous faudra modifier le fichier
HOSTS situé dans 
&lt;p&gt;
&lt;b&gt;C:\windows\system32\drivers\etc&lt;/b&gt; 
&lt;p&gt;
ATTENTION&amp;nbsp;: il s’agit d’un fichier protégé, il est donc impératif de lancer Notepad
en tant qu’administrateur si vous voulez le modifier. 
&lt;p&gt;
&lt;img height=360 src="http://blog.couzy.com/content/binary/WindowsLiveWriter/PrparerunemachinepourdudveloppementCardS_FAC1/clip_image010.jpg" width=604 border=0&gt; 
&lt;p&gt;
Lancez un navigateur et allez sur &lt;a href="https://www.test.com/"&gt;https://www.test.com/&lt;/a&gt; 
&lt;p&gt;
&lt;img height=340 src="http://blog.couzy.com/content/binary/WindowsLiveWriter/PrparerunemachinepourdudveloppementCardS_FAC1/clip_image012.jpg" width=604 border=0&gt; 
&lt;p&gt;
Comme le certificat n’a pas été délivré par une autorité de confiance, IE nous bloque.
Nous allons remédier à cela. 
&lt;p&gt;
1/ Lancez une console d’administration (en tapant mmc) 
&lt;p&gt;
2/ Dans le menu Fichier, demandez l’ajout d’un composant enfichable. Dans la liste
qui apparaît,&amp;nbsp;double-cliquez sur Certificats et choisissez Compte de l’ordinateur
dans la boite de dialogue qui apparaît. 
&lt;p&gt;
3/ Vous devriez maintenant pouvoir accéder au certificat que vous venez de générer&amp;nbsp;: 
&lt;p&gt;
&lt;img height=448 src="http://blog.couzy.com/content/binary/WindowsLiveWriter/PrparerunemachinepourdudveloppementCardS_FAC1/clip_image014.jpg" width=605 border=0&gt; 
&lt;p&gt;
&lt;b&gt;&lt;/b&gt; 
&lt;p&gt;
&lt;b&gt;Copiez maintenant ce certificat dans les certificats des Autorités de certification
racine&lt;/b&gt;.&amp;nbsp;De cette façon ce certificat sera considéré comme valide par Internet
Explorer. Rafraichissez maintenant IE, vous devriez parvenir au résultat escompté&amp;nbsp;: 
&lt;p&gt;
&lt;img height=520 src="http://blog.couzy.com/content/binary/WindowsLiveWriter/PrparerunemachinepourdudveloppementCardS_FAC1/clip_image016.jpg" width=605 border=0&gt; 
&lt;h4&gt;Paramétrage du certificat pour CardSpace.
&lt;/h4&gt;
&lt;p&gt;
Il nous reste une dernière manipulation à effectuer&amp;nbsp;: notre application Web aura
tôt ou tard besoin de lire la clé privée du certificat que nous venons de générer.
Par défaut, cette clé est protégée et aucune application Web ne peut s’en servir directement.
Il existe des méthodes plus élégantes que celle que je vais vous donner maintenant,
mais elles demandent des outils supplémentaires. 
&lt;p&gt;
Relancer un command prompt en mode administrateur&lt;b&gt; &lt;/b&gt;et rendez-vous dans le répertoire &lt;b&gt;\ProgramData\Microsoft\Crypto\RSA\MachineKeys&lt;/b&gt; 
&lt;p&gt;
Puis tapez &lt;b&gt;Explorer .&lt;/b&gt; (n’oubliez pas le point) 
&lt;p&gt;
Si aucun fichier n’apparaît modifiez vos options d’affichage pour voir les fichiers
système. 
&lt;p&gt;
(nota&amp;nbsp;: le chemin pour XP/2003 est &lt;b&gt;C:\Documents and Settings\All Users\Application
Data\Microsoft\Crypto\RSA\MachineKeys&lt;/b&gt;) 
&lt;p&gt;
&lt;b&gt;&lt;img height=453 src="http://blog.couzy.com/content/binary/WindowsLiveWriter/PrparerunemachinepourdudveloppementCardS_FAC1/clip_image018.jpg" width=605 border=0&gt;&lt;/b&gt; 
&lt;p&gt;
Sélectionnez maintenant le fichier le plus récent (il représente le certificat que
vous venez d’ajouter), et modifiez sa sécurité pour donner au compte SERVICE RÉSEAU
les droits de lecture sur le fichier. 
&lt;p&gt;
&lt;img height=516 src="http://blog.couzy.com/content/binary/WindowsLiveWriter/PrparerunemachinepourdudveloppementCardS_FAC1/clip_image020.jpg" width=604 border=0&gt; 
&lt;p&gt;
Attention, le compte est bien SERVICE RÉSEAU avec un é en majuscules (faites un copier/coller
depuis cet article si vous ne savez pas faire un É avec votre clavier). Il s’agit
du compte qui fait tourner votre site web, vous pouvez bien sûr le modifier en allant
dans la console d’administration d’IIS. 
&lt;p&gt;
(nota&amp;nbsp;: sous XP le compte est probablement ASPNET) 
&lt;h4&gt;Tester l’installation
&lt;/h4&gt;
&lt;p&gt;
Placez le fichier test.aspx dans c:\inetpub\wwwroot et naviguez sur &lt;a href="https://www.test.com/test.aspx"&gt;https://www.test.com/test.aspx&lt;/a&gt; 
&lt;p&gt;
&lt;img height=404 src="http://blog.couzy.com/content/binary/WindowsLiveWriter/PrparerunemachinepourdudveloppementCardS_FAC1/clip_image022.jpg" width=605 border=0&gt; 
&lt;p&gt;
Le bouton Déclencher le sélecteur devrait faire apparaître le sélecteur d’identité
où vous pourrez sélectionner une carte personnelle. 
&lt;p&gt;
&lt;img height=440 src="http://blog.couzy.com/content/binary/WindowsLiveWriter/PrparerunemachinepourdudveloppementCardS_FAC1/clip_image024.jpg" width=605 border=0&gt; 
&lt;p&gt;
Elle servira à générer un jeton chiffré consultable dans la textbox (enfin, vous n’apprendrez
pas grand-chose puisqu’il est chiffré)&amp;nbsp;? Le bouton Envoyer au serveur déclenchera
le décodage du jeton et l’affichage de son contenu. 
&lt;p&gt;
&lt;img height=421 src="http://blog.couzy.com/content/binary/WindowsLiveWriter/PrparerunemachinepourdudveloppementCardS_FAC1/clip_image026.jpg" width=605 border=0&gt; 
&lt;p&gt;
&lt;img height=421 src="http://blog.couzy.com/content/binary/WindowsLiveWriter/PrparerunemachinepourdudveloppementCardS_FAC1/clip_image028.jpg" width=605 border=0&gt;
&lt;/p&gt;
&lt;a href="http://blog.couzy.com/content/binary/test.zip"&gt;test.zip (5,73 KB)&lt;/a&gt;&lt;img width="0" height="0" src="http://blog.couzy.com/aggbug.ashx?id=4092feab-d315-4d00-b19a-7cd52c47aafe" /&gt;</description>
    </item>
    <item>
      <trackback:ping>http://blog.couzy.com/Trackback.aspx?guid=4e23bb4f-455e-4aac-958d-963105f76615</trackback:ping>
      <pingback:server>http://blog.couzy.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.couzy.com/PermaLink,guid,4e23bb4f-455e-4aac-958d-963105f76615.aspx</pingback:target>
      <dc:creator>Pierre Couzy</dc:creator>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Comment proposer une alternative à FTP sous Windows 2003 ? Aujourd'hui, j'ai
trouvé trois grandes directions de recherche 
</p>
        <blockquote>
          <p>
SSH + sFTP
</p>
          <p>
BITS
</p>
          <p>
WebDAV + SSL
</p>
        </blockquote>
        <p>
SSH sous Windows : je n'ai pas épuisé le sujet, mais je n'ai pas trouvé d'implémentation
standard, simple de mise en oeuvre, et stable sous Windows 2003. La piste la plus
prometteuse pour le moment est un portage Win32 de OpenSSH (<a href="http://sourceforge.net/projects/sshwindows">http://sourceforge.net/projects/sshwindows</a>),
mais le forum et la liste des bugs sont dissuasifs : pas d'activité depuis longtemps,
et des problèmes récurrents de stabilité.
</p>
        <p>
BITS : l'implémentation est robuste et l'intégration serveur est bonne, il manque
encore un client disponible pour mes utilisateurs. Pour le moment on trouve un utilitaire
en ligne de commande pour XP, et quelques wrappers .Net pour la manipulation des jobs,
mais il reste quelques ennuyeux problèmes de sécurité (notamment comment protéger
un login et un password dans l'application cliente). Exit donc pour quelque temps.
</p>
        <p>
WebDAV + SSL : plus intéressant, puisque la couche de sécurité est robuste et qu'un
client WebDav est intégré à l'explorateur Windows. C'est cette solution que je retiens
pour le moment. Il reste encore quelques écueils à surmonter, principalement côté
serveur. En deux mots, je me refuse à utiliser WebDAV sans SSL.
</p>
        <p>
Ma roadmap :
</p>
        <p>
1/ Installation de  WebDAV
</p>
        <p>
Simple, WebDAV est planqué dans l'install de Windows
</p>
        <p>
2/ Création d'un AppPool avec un compte spécifique. Ce compte est destiné à limiter
les privilèges des sites manipulant WebDAV
</p>
        <p>
3/ Création d'une zone disque et d'un site web destiné aux transferts
</p>
        <p>
4/ Pose de SSL sur le site.
</p>
        <p>
cscript.exe adsutil.vbs set /w3svc/<i>&lt;site identifier&gt;</i>/SecureBindings ":443<i>:&lt;host
header&gt;</i>" 
</p>
        <p>
cscript.exe adsutil.vbs set /w3svc/&lt;<i>site identifier</i>&gt;/AccessSSL TRUE 
</p>
        <p>
Voilà, SSL est posé et seul SSL est utilisable.
</p>
        <img width="0" height="0" src="http://blog.couzy.com/aggbug.ashx?id=4e23bb4f-455e-4aac-958d-963105f76615" />
      </body>
      <title>SSL + WebDAV + host header name</title>
      <guid isPermaLink="false">http://blog.couzy.com/PermaLink,guid,4e23bb4f-455e-4aac-958d-963105f76615.aspx</guid>
      <link>http://blog.couzy.com/PermaLink,guid,4e23bb4f-455e-4aac-958d-963105f76615.aspx</link>
      <pubDate>Sat, 14 Oct 2006 17:01:52 GMT</pubDate>
      <description>&lt;p&gt;
Comment proposer une alternative à FTP sous Windows 2003&amp;nbsp;? Aujourd'hui, j'ai
trouvé trois grandes directions de recherche 
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
SSH + sFTP
&lt;/p&gt;
&lt;p&gt;
BITS
&lt;/p&gt;
&lt;p&gt;
WebDAV + SSL
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
SSH sous Windows : je n'ai pas épuisé le sujet, mais je n'ai pas trouvé d'implémentation
standard, simple de mise en oeuvre, et stable sous Windows 2003. La piste la plus
prometteuse pour le moment est un portage Win32 de OpenSSH (&lt;a href="http://sourceforge.net/projects/sshwindows"&gt;http://sourceforge.net/projects/sshwindows&lt;/a&gt;),
mais le forum et la liste des bugs sont dissuasifs : pas d'activité depuis longtemps,
et des problèmes récurrents de stabilité.
&lt;/p&gt;
&lt;p&gt;
BITS : l'implémentation est robuste et l'intégration serveur est bonne, il manque
encore un client disponible pour mes utilisateurs. Pour le moment on trouve un utilitaire
en ligne de commande pour XP, et quelques wrappers .Net pour la manipulation des jobs,
mais il reste quelques ennuyeux problèmes de sécurité (notamment comment protéger
un login et un password dans l'application cliente). Exit donc pour quelque temps.
&lt;/p&gt;
&lt;p&gt;
WebDAV + SSL : plus intéressant, puisque la couche de sécurité est robuste et qu'un
client WebDav est intégré à l'explorateur Windows. C'est cette solution que je retiens
pour le moment. Il reste encore quelques écueils à surmonter, principalement côté
serveur. En deux mots, je me refuse à utiliser WebDAV sans SSL.
&lt;/p&gt;
&lt;p&gt;
Ma roadmap :
&lt;/p&gt;
&lt;p&gt;
1/ Installation de&amp;nbsp; WebDAV
&lt;/p&gt;
&lt;p&gt;
Simple, WebDAV est planqué dans l'install de Windows
&lt;/p&gt;
&lt;p&gt;
2/ Création d'un AppPool avec un compte spécifique. Ce compte est destiné à limiter
les privilèges des sites manipulant WebDAV
&lt;/p&gt;
&lt;p&gt;
3/ Création d'une zone disque et d'un site web destiné aux transferts
&lt;/p&gt;
&lt;p&gt;
4/ Pose de SSL sur le site.
&lt;/p&gt;
&lt;p&gt;
cscript.exe adsutil.vbs set /w3svc/&lt;i&gt;&amp;lt;site identifier&amp;gt;&lt;/i&gt;/SecureBindings ":443&lt;i&gt;:&amp;lt;host
header&amp;gt;&lt;/i&gt;" 
&lt;p&gt;
cscript.exe adsutil.vbs set /w3svc/&amp;lt;&lt;i&gt;site identifier&lt;/i&gt;&amp;gt;/AccessSSL TRUE 
&lt;p&gt;
Voilà, SSL est posé et seul SSL est utilisable.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.couzy.com/aggbug.ashx?id=4e23bb4f-455e-4aac-958d-963105f76615" /&gt;</description>
    </item>
    <item>
      <trackback:ping>http://blog.couzy.com/Trackback.aspx?guid=ab4b183d-1a38-4ae4-8d04-6b68b5a96bf1</trackback:ping>
      <pingback:server>http://blog.couzy.com/pingback.aspx</pingback:server>
      <pingback:target>http://blog.couzy.com/PermaLink,guid,ab4b183d-1a38-4ae4-8d04-6b68b5a96bf1.aspx</pingback:target>
      <dc:creator>Pierre Couzy</dc:creator>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Vista est sur le point de sortir, alors esayons d'y voir clair en matière de développement.
Malgré tout ce que vous avez pu entendre ou lire ces derniers mois, Vista est beaucoup
plus qu'un relookage de Windows XP. Pour vous en convaincre, allez donc lire <a href="http://en.wikipedia.org/wiki/Windows_Vista">http://en.wikipedia.org/wiki/Windows_Vista</a>,
qui déroule en une seule page concise la liste des nouveautés. 
</p>
        <p>
Dans l'ensemble, les applications Windows conçues pour XP tournent directement sur
Vista. Dans l'ensemble seulement, puisque les nombreuses modifications liées à la
sécurité bloquent certaines fonctionnalités des programmes. Les applications .Net
sont bien évidemment peu concernées par ces modifications, puisqu'elles reposent sur
un framework conçu et adapté par Microsoft. Pour les applications Win32 classiques
tout dépend de ce que fait votre programme, et plus vous tentiez de prendre la main
sur le fonctionnement normal de l'OS plus vous risquez de mauvaises surprises en exécution
dans un environnement normal sous Vista (vous pouvez bien sûr détacher les ceintures
de sécurité et désactiver un certain nombre de protections, mais c'est à vos risques
et périls).
</p>
        <p>
Visual Studio est l'une des applications les plus intrusives sur le système d'exploitation
: intégration d'un débogueur capable de prendre la main dans tous les environnements,
de JavaScript à VB6 en passant pas SQL Server et .Net, accès aux services, déboguage
à distance, développement de drivers, etc. En pratique, Visual Studio (2002, 2003,
et 2005) ne fonctionne pas complètement sous Vista : en tant qu'éditeur de code et
environnement de compilation il donne satisfaction, mais certaines fonctionnalités
avancées seront vraisemblablement bloquées par le système d'exploitation.
</p>
        <p>
Quelles sont les possibilités offertes au développeur pour se prémunir contre les
mauvaises surprises ? Pour Visual Studio 2005, le SP1 devrait combler la plupart des
lacunes, et les éventuels bugs résiduels seront corrigés au fur et à mesure de leur
découverte. Pour Visual Studio 2003 le problème est plus délicat, et pour le moment
Microsoft ne supporte pas Visual Studio 2003 sous Vista, même si la plupart des scénarios
d'utilisation fonctionnent. Il reste alors deux possibilités. Soit faire tourner Visual
Studio 2003 sous Windows XP (éventuellement dans une VPC) ou Windows 2003, soit
utiliser MSBuild pour éditer et compiler des projets .Net 1.1.
</p>
        <p>
Cette possibilité n'est pas offerte nativement par MSBuild, mais vous trouverez sur
CodePlex la solution (<a href="http://www.codeplex.com/Wiki/View.aspx?ProjectName">http://www.codeplex.com/Wiki/View.aspx?ProjectName</a>).
MSBee, puisque c'est son nom, est un add-on à MSBuild permettant de faire de
la compilation .Net 1.1 depuis MSBuild, et donc d'utiliser le même outil pour
.Net 1, 2 et 3 dans vos développements. 
</p>
        <img width="0" height="0" src="http://blog.couzy.com/aggbug.ashx?id=ab4b183d-1a38-4ae4-8d04-6b68b5a96bf1" />
      </body>
      <title>Visual Studio 2003, Vista, et MSBuild</title>
      <guid isPermaLink="false">http://blog.couzy.com/PermaLink,guid,ab4b183d-1a38-4ae4-8d04-6b68b5a96bf1.aspx</guid>
      <link>http://blog.couzy.com/PermaLink,guid,ab4b183d-1a38-4ae4-8d04-6b68b5a96bf1.aspx</link>
      <pubDate>Tue, 03 Oct 2006 15:23:29 GMT</pubDate>
      <description>&lt;p&gt;
Vista est sur le point de sortir, alors esayons d'y voir clair en matière de développement.
Malgré tout ce que vous avez pu entendre ou lire ces derniers mois, Vista est beaucoup
plus qu'un relookage de Windows XP. Pour vous en convaincre, allez donc lire &lt;a href="http://en.wikipedia.org/wiki/Windows_Vista"&gt;http://en.wikipedia.org/wiki/Windows_Vista&lt;/a&gt;,
qui déroule en une seule page concise la liste des nouveautés. 
&lt;/p&gt;
&lt;p&gt;
Dans l'ensemble, les applications Windows conçues pour XP tournent directement sur
Vista. Dans l'ensemble seulement, puisque les nombreuses modifications liées à la
sécurité bloquent certaines fonctionnalités des programmes. Les applications .Net
sont bien évidemment peu concernées par ces modifications, puisqu'elles reposent sur
un framework conçu et adapté par Microsoft. Pour les applications Win32 classiques
tout dépend de ce que fait votre programme, et plus vous tentiez de prendre la main
sur le fonctionnement normal de l'OS plus vous risquez de mauvaises surprises en exécution
dans un environnement normal sous Vista (vous pouvez bien sûr détacher les ceintures
de sécurité et désactiver un certain nombre de protections, mais c'est à vos risques
et périls).
&lt;/p&gt;
&lt;p&gt;
Visual Studio est l'une des applications les plus intrusives sur le système d'exploitation
: intégration d'un débogueur capable de prendre la main dans tous les environnements,
de JavaScript à VB6 en passant pas SQL Server et .Net, accès aux services, déboguage
à distance, développement de drivers, etc. En pratique, Visual Studio (2002, 2003,
et 2005) ne fonctionne pas complètement sous Vista : en tant qu'éditeur de code et
environnement de compilation il donne satisfaction, mais certaines fonctionnalités
avancées seront vraisemblablement bloquées par le système d'exploitation.
&lt;/p&gt;
&lt;p&gt;
Quelles sont les possibilités offertes au développeur pour se prémunir contre les
mauvaises surprises ? Pour Visual Studio 2005, le SP1 devrait combler la plupart des
lacunes, et les éventuels bugs résiduels seront corrigés au fur et à mesure de leur
découverte. Pour Visual Studio 2003 le problème est plus délicat, et pour le moment
Microsoft ne supporte pas Visual Studio 2003 sous Vista, même si la plupart des scénarios
d'utilisation fonctionnent. Il reste alors deux possibilités. Soit faire tourner Visual
Studio&amp;nbsp;2003 sous Windows XP (éventuellement dans une VPC) ou Windows 2003, soit
utiliser&amp;nbsp;MSBuild pour éditer et compiler des projets .Net 1.1.
&lt;/p&gt;
&lt;p&gt;
Cette possibilité n'est pas offerte nativement par MSBuild, mais vous trouverez sur
CodePlex la solution (&lt;a href="http://www.codeplex.com/Wiki/View.aspx?ProjectName"&gt;http://www.codeplex.com/Wiki/View.aspx?ProjectName&lt;/a&gt;).
MSBee, puisque c'est son nom, est un&amp;nbsp;add-on à MSBuild permettant de faire de
la compilation .Net 1.1 depuis MSBuild, et donc d'utiliser le même&amp;nbsp;outil pour
.Net&amp;nbsp;1, 2 et 3 dans vos développements. 
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.couzy.com/aggbug.ashx?id=ab4b183d-1a38-4ae4-8d04-6b68b5a96bf1" /&gt;</description>
    </item>
  </channel>
</rss>