Comment utiliser Windows CardSpace avec Internet Explorer 7.0
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 |
---|---|
|
Indique au navigateur d'afficher l'objet Sélecteur d'identité. |
|
Contrôle le type de jeton émis par le sélecteur d'identité ; dans le cas présent, un jeton SAML 1.0. |
|
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é. |
|
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.
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.
Cliquez sur Créer une carte personnelle ; l'écran de création des cartes auto-émises s'affiche.
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.
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.
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>
.
Remarque : |
---|
Le texte du jeton dans la zone de texte ne correspond pas exactement au texte du jeton dans la page |
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 |
---|---|---|
|
60 |
Facultatif. Le nombre maximal de secondes pendant lesquelles le client et le serveur peut être désynchronisés. |
|
<aucun> |
Facultatif. L'empreinte numérique du certificat à utiliser pour déchiffrer les jetons. La classe de jeton consulte automatiquement le certificat. |
|
My |
Facultatif. Le nom de magasin du certificat SSL. En général « Mon ». |
|
LocalMachine |
Facultatif. L'emplacement du magasin du certificat SSL. En général, « LocalMachine ». |
|
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.
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.
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.
Envoyer des commentaires sur cette rubrique à Microsoft.
Copyright ©2007 par Microsoft Corporation. Tous droits réservés.