Cómo usar Windows CardSpace con Internet Explorer 7.0
CardSpace proporciona a los usuarios la capacidad de administrar sus identidades digitales, y con Internet Explorer 7.0, los sitios Web pueden solicitar una identidad digital al usuario. Los ejercicios siguientes muestran los pasos para aceptar identidades mediante CardSpace e Internet Explorer 7.0. Hay cuatro ejercicios.
Hello, World!
Activar el selector de identidad a petición
Tener acceso a las notificaciones en el token de seguridad
Identificar al usuario de forma unívoca
Para realizar los ejercicios, es necesario configurar el sitio Web. La configuración se hace utilizando el archivo por lotes de instalación proporcionado en la carpeta de ejemplo:
Setup.bat
Para obtener más información sobre la instalación del sitio Web y la solución a algunos problemas, vea Instalación de certificados de ejemplo de CardSpace.
Hello World! Ejemplo
El ejemplo Hello World muestra el código HTML necesario para utilizar el selector de identidad. Este ejemplo utiliza los archivos siguientes:
sample1.htm
login1.aspx
El selector de identidad se muestra utilizando un elemento <object>
o un objeto de comportamiento binario. La manera más fácil es incluir el elemento <object>
en el cuerpo de un elemento <form>
, que activa el selector de identidad cuando se envía el formulario. A continuación, se muestra el archivo 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>
Los resultados del elemento <object>
se exponen directamente en la página login1.aspx, donde se produce el procesamiento. El selector de identidad muestra cuándo se presiona el botón de envío.
Los elementos importantes del elemento de objeto son:
Elemento | Descripción |
---|---|
|
Indica al explorador que muestre el objeto del selector de identidad. |
|
Controla el tipo de token que el selector de identidad emite; en este caso, un token SAML 1.0. |
|
La dirección URL del proveedor de identidad que proporciona la identidad. En este caso, un URI cableado que invoca el proveedor integrado, autoemisor. |
|
El usuario de confianza le pide al usuario que proporcione un token del proveedor de identidad (o el usuario) con ciertas notificaciones. Estos ejemplos forman parte del conjunto pre-definido para tarjetas autoemitidas (personal). |
Cuando se presiona el botón, se muestra el selector de identidad CardSpace. Esto permite al usuario seleccionar una identidad CardSpace para enviar.
Haga clic en Sí, elegir enviar una tarjeta. Si no hay ninguna tarjeta en el sistema, el selector de identidad presenta la oportunidad de crear o importar una tarjeta.
Haga clic en Crear una nueva tarjeta personal y se mostrará la pantalla para crear tarjetas autoemitidas.
Rellene los campos obligatorios, elija una imagen, dé un nombre a la tarjeta y haga clic en Guardar. Cuando se ha creado una tarjeta personal que satisfaga las notificaciones enumeradas, envíe la tarjeta.
Los datos de tarjeta cifrados se envían a la página Login1.aspx siguiente (que se muestra abajo 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>
Los datos de tarjeta cifrados se envían a la página login1.aspx en 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 página login1.aspx muestra el token cifrado de nuevo en la pantalla.
Activar el selector de identidad a petición
Este ejemplo muestra un método para mostrar el selector de identidad con más flexibilidad. El ejemplo utiliza los archivos siguientes:
Sample2.htm
Login2.aspx
Los programadores pueden desear más flexibilidad en cuanto a los tiempos y la administración de la invocación del selector de identidad. Para mostrar el selector de identidad a una hora más apta para una aplicación determinada, se crean scripts del elemento <object>
para devolver el token cifrado a petición. Esto se muestra en el archivo Sample2.htm siguiente.
<!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>
El elemento <object>
se coloca en el encabezado del documento HTML y se invoca el selector de identidad cuando se tiene acceso a la propiedad de valor. El script de este ejemplo coloca el token XML en un elemento <textarea>
que permite al programador ver el contenido antes de que se envíe <form>
.
Nota
El texto del token en el área de texto no coincide exactamente con el texto del token en la página login2.aspx
porque el explorador está suprimiendo la presentación de las etiquetas XML.
Obtener acceso a las notificaciones
Este ejemplo muestra cómo utilizar TokenProcessor.cs
para tener acceso a las notificaciones en una tarjeta enviada a un sitio Web. El ejemplo utiliza los archivos siguientes:
Sample3.htm
Login3.aspx
app_code\TokenProcessor.cs
Web.config
Para procesar las notificaciones fuera de los datos cifrados, los programadores que utilizan ASP.NET 2.0 pueden utilizar el código muestra TokenProcessor.cs
presentado en este ejercicio. La clase Token
administra todo el descifrado y comprobación del token, utilizando las clases Windows Communication Foundation (WCF). La clase Token
se utiliza en la página de destino del envío, en este caso la página 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>
Y 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>
Para obtener los valores de las notificaciones del token, utilice la propiedad Claims
. Esto toma el URI de la notificación como un parámetro y devuelve el valor como string
. Los URI para tarjetas autoemitidas se listan más adelante en este documento pero, para ahorrar tiempo, están definidos en la clase SelfIssued
.
Existen datos de configuración que acompañan a la clase Token
. En el archivo Web.config, los elementos de configuración se pueden encontrar:
<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>
Elemento | Valor | Descripción |
---|---|---|
|
60 |
Opcional. El número máximo de segundos que el cliente y el servidor pueden estar fuera del sesgo. |
|
<none> |
Opcional. La huella digital del certificado que se debe utilizar para descifrar los tokens. La clase de token busca automáticamente en el certificado. |
|
My |
Opcional. El nombre de almacén del certificado SSL. Normalmente "My". |
|
LocalMachine |
Opcional. La ubicación del almacén del certificado SSL. Normalmente "LocalMachine". |
|
PPID |
Opcional. El URI para el tipo de notificación utilizado como la notificación que identifica unívocamente al usuario. |
Cuando el token se envía a la página de inicio de sesión y se descifra, podemos ver los valores de notificación.
Identificar al usuario de forma unívoca
Este ejemplo muestra cómo utilizar la clase Token
para identificar a un usuario de forma unívoca. Este ejemplo utiliza los archivos siguientes:
Sample4.htm
Login4.aspx
app_code\TokenProcessor.cs
web.config
Teniendo en cuenta que cualquiera puede crear una tarjeta con los mismos valores para la notificación, es necesario poder identificar de forma unívoca una tarjeta determinada, diferente de los valores de notificación de emisión propia. Esto se hace calculando UniqueID
de la tarjeta. UniqueID
es el hash de la clave pública del emisor y cualquier notificación única para ese emisor. Puesto que las claves para la conversación entre el cliente y el servidor se generan de forma aleatoria en la primera comunicación, la clave pública es única de la tarjeta –si utiliza la misma tarjeta autoemitida en varios sitios, se genera un nuevo par de claves con cada nueva asociación. Para la notificación única, el Identificador personal privado (PPID) de la tarjeta es único para ese emisor. La propiedad UniqueID
calcula el valor con hash para el programador. Agregar el código a la página 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>
Y 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>
El resultado es un valor hash de 20 caracteres, codificado por base64, que se puede utilizar en una base de datos para identificar de manera unívoca a un visitante.
Para cambiar la notificación utilizada para la univocidad, agregue la clave siguiente a Web.config y cambie el valor a un URI de notificación diferente.
<add key="IdentityClaimType" value="https://schemas.xmlsoap.org/ws/2005/05/identity/claims/privatepersonalidentifier"/>
Acerca del token actual
Para obtener más información sobre el formato y la utilización del token XML, consulte los recursos siguientes:
https://go.microsoft.com/fwlink/?LinkId=95951
Notificaciones en tarjetas de emisión propia
Nombre dado = "https://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname";
Dirección de correo electrónico = "https://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress";
Apellido = "https://schemas.xmlsoap.org/ws/2005/05/identity/claims/surname";
Calle = "https://schemas.xmlsoap.org/ws/2005/05/identity/claims/streetaddress";
Localidad = "https://schemas.xmlsoap.org/ws/2005/05/identity/claims/locality";
Estado/Provincia = "https://schemas.xmlsoap.org/ws/2005/05/identity/claims/stateorprovince";
Código postal = "https://schemas.xmlsoap.org/ws/2005/05/identity/claims/postalcode";
País = "https://schemas.xmlsoap.org/ws/2005/05/identity/claims/country";
Teléfono fijo = "https://schemas.xmlsoap.org/ws/2005/05/identity/claims/homephone";
Otro teléfono = "https://schemas.xmlsoap.org/ws/2005/05/identity/claims/otherphone";
Teléfono móvil = "https://schemas.xmlsoap.org/ws/2005/05/identity/claims/mobilephone";
Fecha de nacimiento = "https://schemas.xmlsoap.org/ws/2005/05/identity/claims/dateofbirth";
Sexo = "https://schemas.xmlsoap.org/ws/2005/05/identity/claims/gender";
PPID = "https://schemas.xmlsoap.org/ws/2005/05/identity/claims/privatepersonalidentifier";
Sitio Web = "https://schemas.xmlsoap.org/ws/2005/05/identity/claims/website";
Glosario
Proveedor de identidad - La agencia (compañía, sitio Web, organización, usted mismo) que está validando las notificaciones sobre un sujeto (persona).
Selector de identidad - El selector de identidad es el diálogo que presenta las diferentes identidades digitales del usuario y permite la selección de una identidad pertinente para su envío al usuario de confianza.
Usuario de confianza - La agencia (sitio Web, servidor u otra parte) que confía en las notificaciones presentada por el sujeto.
Sujeto - La entidad (el usuario) que tiene notificaciones sobre su identidad. El sujeto siempre controla el lanzamiento de su información de identidad digital al usuario de confianza.
Enviar comentarios sobre este tema a Microsoft.
Copyright © 2007 Microsoft Corporation. Reservados todos los derechos.