Comment utiliser Windows CardSpace avec Internet Explorer 7.0

Download sample

CardSpace donne aux utilisateurs la possibilité de gérer leurs identités numériques et, avec Internet Explorer 7.0, les sites Web peuvent réclamer une identité numérique à l'utilisateur. Les exercices suivants montrent les étapes à suivre pour accepter des identités à l'aide de CardSpace et d'Internet Explorer 7.0. Cette procédure pas à pas contient quatre exercices :

  • Hello, World!

  • Activer le sélecteur d'identité à la demande

  • Accéder aux revendications du jeton de sécurité

  • Identifier l'utilisateur de manière unique

Il est nécessaire de configurer un site Web pour effectuer les exercices. La configuration est exécutée à l'aide du fichier batch d'installation, fourni dans le dossier exemple :

Setup.bat

Pour plus d'informations sur l'installation du site Web, et quelques conseils en matière de dépannage, consultez Installation de certificats pour les exemples CardSpace.

Hello World! Exemple

L'exemple Hello World montre le code HTML requis pour utiliser le sélecteur d'identité. Cet exemple utilise les fichiers suivants :

sample1.htm

login1.aspx

Le sélecteur d'identité est affiché à l'aide d'un élément <object> ou d'un objet de comportement binaire. La façon la plus simple consiste à inclure l'élément <object> dans le corps d'un élément <form>, qui active le sélecteur d'identité lors de l'envoi du formulaire. Ci-dessous le fichier sample1.htm :

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
  <title>Sample 1</title>
</head>
<body>
    <form id="form1" method="post" action="login1.aspx">
      <button type="submit">Click here to sign in with your Information Card</button>
      <object type="application/x-informationcard" name="xmlToken">
        <param name="tokenType" value="urn:oasis:names:tc:SAML:1.0:assertion" />
        <param name="issuer" 
               value="https://schemas.xmlsoap.org/ws/2005/05/identity/issuer/self" />
        <param name="requiredClaims" 
             value="https://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname
                    https://schemas.xmlsoap.org/ws/2005/05/identity/claims/surname
                    https://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress
                    https://schemas.xmlsoap.org/ws/2005/05/identity/claims/privatepersonalidentifier" />
      </object>
    </form>
</body>
</html>

Les résultats de l'élément <object> sont publiés directement dans la page login1.aspx, où le traitement se produit. Le sélecteur d'identité s'affiche lorsque vous cliquez sur le bouton Envoyer.

Les éléments importants de l'élément objet sont les suivants :

Élément Description

type="application/x-informationcard"

Indique au navigateur d'afficher l'objet Sélecteur d'identité.

param name="tokenType"

Contrôle le type de jeton émis par le sélecteur d'identité ; dans le cas présent, un jeton SAML 1.0.

param name="issuer"

URL du fournisseur d'identité qui fournit l'identité. Dans le cas présent, un URI codé en dur qui appelle le fournisseur auto-émetteur intégré.

param name="requiredClaims"

La partie de confiance demande à l'utilisateur de présenter un jeton provenant du fournisseur d'identité (ou de l'utilisateur), contenant certaines revendications. Les exemples présentés ici font partie du jeu prédéfini des cartes (personnelles) auto-émises.

Lorsque vous cliquez sur le bouton, le sélecteur d'identité CardSpace apparaît à l'écran. Cela permet à l'utilisateur de sélectionner une identité CardSpace à soumettre.

Sélection de carte Windows CardSpace

Cliquez Oui, choisissez d'envoyer une carte. En l'absence de cartes dans le système, le sélecteur d'identité offre la possibilité d'en créer ou d'en importer une.

Utilisation de Windows CardSpace avec Internet Explorer 7.0

Cliquez sur Créer une carte personnelle ; l'écran de création des cartes auto-émises s'affiche.

Modification de carte Windows CardSpace

Remplissez les champs requis, choisissez une image, donnez un nom à la carte, puis cliquez sur Enregistrer. Lorsqu'une carte personnelle a été créée en satisfaisant les revendications répertoriées, envoyez la carte.

Envoi d'une carte Windows CardSpace à un site

Les données de carte chiffrées sont envoyées à la page login1.aspx suivante (montrée ci-dessous en C#).

<%@ Page Language="C#"  Debug="true" ValidateRequest="false"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">

    protected void Page_Load(object sender, EventArgs e) {
        Label1.Text = Request.Params["xmlToken"];
    }
</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        The value of the token is:<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label></div>
    </form>
</body>
</html>

Les données de carte chiffrées sont envoyées à la page login1.aspx dans VB.net :

<%@ Page Language="VB"  Debug="true" ValidateRequest="false"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">
Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
   Label1.Text = Request.Params("xmlToken");
End Sub
</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        The value of the token is:<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label></div>
    </form>
</body>
</html>

La page login1.aspx renvoie le jeton chiffré à l'écran.

Utilisation de Windows CardSpace avec Internet Explorer 7.0

Activation du sélecteur d'identité à la demande

Cet exemple montre une méthode d'affichage du sélecteur d'identité plus souple. L'exemple utilise les fichiers suivants :

Sample2.htm

Login2.aspx

Les développeurs peuvent souhaiter disposer de plus de souplesse en matière de synchronisation et de traitement de l'appel du sélecteur d'identité. Pour afficher le sélecteur d'identité à un moment plus approprié pour une application particulière, l'élément <object> est écrit pour retourner le jeton chiffré à la demande. Cela est montré dans le fichier sample2.htm suivant.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
  <title>Sample 2</title>
  <object type="application/x-informationcard" name="_xmlToken">
    <param name="tokenType" value="urn:oasis:names:tc:SAML:1.0:assertion" />
    <param name="requiredClaims" 
        value="https://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname
        https://schemas.xmlsoap.org/ws/2005/05/identity/claims/surname
        https://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress
        https://schemas.xmlsoap.org/ws/2005/05/identity/claims/privatepersonalidentifier" />
  </object>
  <script language="javascript">
    function GoGetIt(){
      var xmltkn=document.getElementById("_xmltoken");
      var thetextarea = document.getElementById("xmltoken");
      thetextarea.value = xmltkn.value ;
    }
  </script>
</head>
<body>
  <form id="form1" method="post" action="login2.aspx">
    <button name="go" id="go" onclick="javascript:GoGetIt();">Click here to get the token.</button>
    <button type="submit">Click here to send the card to the server</button>
    <textarea cols=100 rows=20 id="xmltoken" name="xmlToken" ></textarea>
  </form>
</body>
</html>

L'élément <object> est placé dans l'en-tête du document HTML, et le sélecteur d'identité est appelé lorsqu'un utilisateur accède à la propriété de valeur. Dans cet exemple, le script place le jeton XML dans un élément <textarea> qui permet au développeur de consulter le contenu avant l'envoi du <form>.

NoteRemarque :

Le texte du jeton dans la zone de texte ne correspond pas exactement au texte du jeton dans la page login2.aspx car le navigateur n'affiche pas les balises XML.

Accéder aux revendications

Cet exemple montre comment utiliser TokenProcessor.cs pour accéder aux revendications contenues dans une carte envoyée à un site Web. L'exemple utilise les fichiers suivants :

Sample3.htm

Login3.aspx

app_code\TokenProcessor.cs

Web.config

Pour traiter les revendications issues des données chiffrées, les développeurs qui utilisent ASP.NET 2.0 peuvent utiliser l'exemple de code TokenProcessor.cs présenté dans cet exercice. La classe Token gère toutes les tâches de déchiffrement et de vérification du jeton, à l'aide des classes Windows Communication Foundation (WCF). La classe Token est utilisée dans la page cible de la publication, dans le cas présent, la page login3.aspx en C#:

<%@ Page Language="C#"  Debug="true" ValidateRequest="false" %>
<%@ Import Namespace="System.IdentityModel.Claims" %>
<%@ Import Namespace="Microsoft.IdentityModel.TokenProcessor" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">

    protected void ShowError(string text) {
        fields.Visible = false;
        errors.Visible = true;
        errtext.Text = text;
    }
    protected void Page_Load(object sender, EventArgs e)
        string xmlToken;
        xmlToken = Request.Params["xmlToken"];
        if (xmlToken == null || xmlToken.Equals("")){
            ShowError("Token presented was null");
        }
        else {
            Token token= new Token(xmlToken);
            givenname.Text = token.Claims[ClaimTypes.GivenName];
            surname.Text = token.Claims[ClaimTypes.Surname];
            email.Text = token.Claims[ClaimTypes.Email];
        }
        
    }
</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Login Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <div runat="server" id="fields">
        Given Name:<asp:Label ID="givenname" runat="server" Text=""></asp:Label><br/>
        Surname:<asp:Label ID="surname" runat="server" Text=""></asp:Label><br/>
        Email Address:<asp:Label ID="email" runat="server" Text=""></asp:Label><br/>
    </div>
    <div runat="server" id="errors" visible="false">
        Error:<asp:Label ID="errtext" runat="server" Text=""></asp:Label><br/>
    </div>
        
    </form>
</body>
</html>

Et en Visual Basic .NET :

<%@ Page Language="VB"  Debug="true" ValidateRequest="false" %>
<%@ Import Namespace="System.IdentityModel.Claims" %>
<%@ Import Namespace="Microsoft.IdentityModel.TokenProcessor" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">

Protected  Sub ShowError(ByVal text As String) 
   fields.Visible = False 
   errors.Visible = True 
   errtext.Text = text 
End Sub

Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
   Dim xmlToken As String
   xmlToken = Request.Params("xmlToken")
   If xmlToken = Nothing Or xmlToken.Equals("") Then
      ShowError("Token presented was null")
   Else
      Dim token As New Token(xmlToken)
      givenname.Text = token.Claims(ClaimTypes.GivenName)
      surname.Text = token.Claims(ClaimTypes.Surname)
      email.Text = token.Claims(ClaimTypes.Email)
   End If
End Sub
</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Login Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <div runat="server" id="fields">
        Given Name:<asp:Label ID="givenname" runat="server" Text=""></asp:Label><br/>
        Surname:<asp:Label ID="surname" runat="server" Text=""></asp:Label><br/>
        Email Address:<asp:Label ID="email" runat="server" Text=""></asp:Label><br/>
    </div>
    <div runat="server" id="errors" visible="false">
        Error:<asp:Label ID="errtext" runat="server" Text=""></asp:Label><br/>
    </div>
        
    </form>
</body>
</html>

Pour obtenir les valeurs des revendications contenues dans le jeton, utilisez la propriété Claims. Elle prend l'URI de la revendication comme paramètre, et retourne la valeur en tant que string. Les URI des cartes auto-émises sont répertoriés plus loin dans ce document, mais pour gagner du temps, sont aussi prédéfinis dans la classe SelfIssued.

Des données de configuration accompagnent la classe Token. Dans le fichier web.config se trouvent les éléments de configuration suivants :

<configuration>
  <appSettings>
    <add key="MaximumClockSkew" value="60"/>
    <add key="CertifcateThumbprint" value="01234567890ABCDEFEDCBA01234567890ABCDEFEDCBA"/>
    <add key="StoreName" value="My"/>
    <add key="StoreLocation" value="LocalMachine"/>
    <add key="IdentityClaimType" 
         value="https://schemas.xmlsoap.org/ws/2005/05/identity/claims/privatepersonalidentifier"/>
  </appSettings>
<configuration>
Élément Valeur Description

MaximumClockSkew

60

Facultatif. Le nombre maximal de secondes pendant lesquelles le client et le serveur peut être désynchronisés.

CertificateThumbprint

<aucun>

Facultatif. L'empreinte numérique du certificat à utiliser pour déchiffrer les jetons. La classe de jeton consulte automatiquement le certificat.

StoreName

My

Facultatif. Le nom de magasin du certificat SSL. En général « Mon ».

StoreLocation

LocalMachine

Facultatif. L'emplacement du magasin du certificat SSL. En général, « LocalMachine ».

IdentityClaimType

PPID

Facultatif. L'URI du type de revendication utilisé comme revendication identifiant l'utilisateur de manière unique.

Lorsque le jeton est publié sur la page de connexion, puis déchiffré, les valeurs de revendication apparaissent à l'écran.

Utilisation de Windows CardSpace avec Internet Explorer 7.0

Identifier l'utilisateur de manière unique

Cet exemple montre comment utiliser la classe Token pour identifier un utilisateur de manière unique. Cet exemple utilise les fichiers suivants :

Sample4.htm

Login4.aspx

app_code\TokenProcessor.cs

web.config

Étant donné que n'importe qui peut créer une carte dotée des mêmes valeurs pour la revendication, il est nécessaire d'être en mesure d'identifier une carte particulière de manière unique, par un autre moyen que les valeurs de revendication auto-émises. Cela se fait en calculant l'élément UniqueID de la carte. UniqueID correspond au hachage de la clé publique de l'émetteur et de toute revendication propre à cet émetteur. Puisque les clés pour la conversation entre le client et le serveur sont générées de manière aléatoire lors de la première communication, la clé publique est unique à la carte. Si vous utilisez la même carte auto-émise sur plusieurs sites, une nouvelle paire de clés est générée à chaque nouvelle association. Pour la revendication unique, le PPID (Private Personal Identifier) de la carte est propre à cet émetteur. La propriété UniqueID calcule la valeur hachée pour le développeur. Ajout du code dans la page login4.aspx en C# :

<%@ Page Language="C#"  Debug="true" ValidateRequest="false" %>
<%@ Import Namespace="System.IdentityModel.Claims" %>
<%@ Import Namespace="Microsoft.IdentityModel.TokenProcessor" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
    protected void ShowError(string text) {
        fields.Visible = false;
        errors.Visible = true;
        errtext.Text = text;
    }
    protected void Page_Load(object sender, EventArgs e) {
        string xmlToken;
        xmlToken = Request.Params["xmlToken"];
        if (xmlToken == null || xmlToken.Equals(""))
            ShowError("Token presented was null");
        else
        {
                Token token = new Token (xmlToken);
                givenname.Text = token.Claims[SelfIssued.GivenName];
                surname.Text = token.Claims[SelfIssued.Surname];
                email.Text = token.Claims[SelfIssued.EmailAddress];
                uid.Text = token.UniqueID;
        }
    }
</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
    <title>Login Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <div runat="server" id="fields">
        Given Name:<asp:Label ID="givenname" runat="server" Text=""></asp:Label><br/>
        Surname:<asp:Label ID="surname" runat="server" Text=""></asp:Label><br/>
        Email Address:<asp:Label ID="email" runat="server" Text=""></asp:Label><br/>
        Unique ID:<asp:Label ID="uid" runat="server" Text=""></asp:Label><br/>
    </div>
    <div runat="server" id="errors" visible="false">
        Error:<asp:Label ID="errtext" runat="server" Text=""></asp:Label><br/>
    </div>
        
    </form>
</body>
</html>

Et en Visual Basic .NET :

<%@ Page Language="VB"  Debug="true" ValidateRequest="false" %>
<%@ Import Namespace="System.IdentityModel.Claims" %>
<%@ Import Namespace="Microsoft.IdentityModel.TokenProcessor" %>

<script runat="server">
Protected  Sub ShowError(ByVal text As String) 
   fields.Visible = False 
   errors.Visible = True 
   errtext.Text = text 
End Sub

Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
   Dim xmlToken As String
   xmlToken = Request.Params("xmlToken")
   If xmlToken = Nothing Or xmlToken.Equals("") Then
      ShowError("Token presented was null")
   Else
      Dim token As New Token(xmlToken)
      givenname.Text = token.Claims(ClaimTypes.GivenName)
      surname.Text = token.Claims(ClaimTypes.Surname)
      email.Text = token.Claims(ClaimTypes.Email)
      uid.Text = token.UniqueID
   End If
End Sub
</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
    <title>Login Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <div runat="server" id="fields">
        Given Name:<asp:Label ID="givenname" runat="server" Text=""></asp:Label><br/>
        Surname:<asp:Label ID="surname" runat="server" Text=""></asp:Label><br/>
        Email Address:<asp:Label ID="email" runat="server" Text=""></asp:Label><br/>
        Unique ID:<asp:Label ID="uid" runat="server" Text=""></asp:Label><br/>
    </div>
    <div runat="server" id="errors" visible="false">
        Error:<asp:Label ID="errtext" runat="server" Text=""></asp:Label><br/>
    </div>
        
    </form>
</body>
</html>

Le résultat est une valeur de hachage de 20 caractères codée en base 64 qui peut être utilisée dans une base de données pour identifier un visiteur de manière unique.

Utilisation de Windows CardSpace avec Internet Explorer 7.0

Pour modifier la revendication utilisée en garantie d'unicité, ajoutez la clé suivante dans le fichier web.config et remplacez la valeur par un URI de revendication différent.

<add key="IdentityClaimType" value="https://schemas.xmlsoap.org/ws/2005/05/identity/claims/privatepersonalidentifier"/>

À propos du jeton en tant que tel

Pour plus d'informations sur le format et la consommation du jeton XML chiffré, consultez les ressources suivantes :

https://go.microsoft.com/fwlink/?LinkId=95951

Revendications dans les cartes auto-émises

  • Prénom = "https://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname";

  • Adresse de messagerie = "https://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress";

  • Nom = "https://schemas.xmlsoap.org/ws/2005/05/identity/claims/surname";

  • Adresse postale = "https://schemas.xmlsoap.org/ws/2005/05/identity/claims/streetaddress";

  • Localité = "https://schemas.xmlsoap.org/ws/2005/05/identity/claims/locality";

  • Département ou région = "https://schemas.xmlsoap.org/ws/2005/05/identity/claims/stateorprovince";

  • Code postal = "https://schemas.xmlsoap.org/ws/2005/05/identity/claims/postalcode";

  • Pays = "https://schemas.xmlsoap.org/ws/2005/05/identity/claims/country";

  • Téléphone domicile = "https://schemas.xmlsoap.org/ws/2005/05/identity/claims/homephone";

  • Autre téléphone = "https://schemas.xmlsoap.org/ws/2005/05/identity/claims/otherphone";

  • Téléphone mobile = "https://schemas.xmlsoap.org/ws/2005/05/identity/claims/mobilephone";

  • Date de naissance = "https://schemas.xmlsoap.org/ws/2005/05/identity/claims/dateofbirth";

  • Sexe = "https://schemas.xmlsoap.org/ws/2005/05/identity/claims/gender";

  • PPID = "https://schemas.xmlsoap.org/ws/2005/05/identity/claims/privatepersonalidentifier";

  • Site Web = "https://schemas.xmlsoap.org/ws/2005/05/identity/claims/website";

Glossaire

  • Fournisseur d'identité - Agence (société, site Web, organisation, vous-même) qui fait état de revendications à propos d'un sujet (personne).

  • Sélecteur d'identité - Le sélecteur d'identité est la boîte de dialogue qui présente les différentes identités numériques de l'utilisateur et permet la sélection d'une identité pertinente à envoyer à la partie de confiance.

  • Partie de confiance - Agence (site Web, serveur ou autre partie) qui se fonde sur les revendications présentées par le sujet.

  • Sujet - Entité (l'utilisateur) dont l'identité fait l'objet de revendications. Le sujet ne perd jamais le contrôle de la divulgation de son identité numérique à la partie de confiance.

Footer image

Envoyer des commentaires sur cette rubrique à Microsoft.

Copyright ©2007 par Microsoft Corporation. Tous droits réservés.