Internet Explorer 7.0 で Windows CardSpace を使用する方法
CardSpace により、ユーザーによるデジタル ID の管理が可能となり、Internet Explorer 7.0 を介して、Web サイトがユーザーのデジタル ID を要求することができます。次の演習では、CardSpace と Internet Explorer 7.0 を使用して ID を受け入れる手順を示します。このチュートリアルには、次に示す 4 つの演習が用意されています。
Hello, World!
ID セレクタを必要に応じてアクティブ化する
セキュリティ トークンでクレームにアクセスする
ユーザーを一意に特定する
この演習を行うには、Web サイトの構成が必要です。構成は、サンプル フォルダに格納されている次のインストール バッチ ファイルを使用して行います。
Setup.bat
Web サイトのインストールの詳細およびトラブルシューティングのヒントについては、「CardSpace サンプル証明書のインストール」を参照してください。
Hello World! サンプル
Hello World サンプルでは、ID セレクタの使用に必要な HTML コードを示します。このサンプルでは、次のファイルを使用します。
sample1.htm
login1.aspx
ID セレクタは、<object>
要素またはバイナリ動作オブジェクトのどちらかを使用して表示されます。最も簡単な方法は、<object>
要素を <form>
要素の本文に格納することです。これにより、フォームが送信される際に ID セレクタがアクティブ化されます。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>
<object>
要素の結果は login1.aspx ページに直接ポストされ、処理が発生します。[送信] ボタンをクリックすると、ID セレクタが表示されます。
オブジェクト要素の重要な要素は、次のとおりです。
要素 | 説明 |
---|---|
|
ID セレクタ オブジェクトの表示をブラウザに指示します。 |
|
ID セレクタが送出するトークンの種類を制御します。ここでは SAML 1.0 トークンです。 |
|
ID を提供する ID プロバイダ の URL です。ここでは、組み込みの自己発行プロバイダを呼び出す組み込み URI です。 |
|
証明書利用者はユーザーに対し、特定のクレームを使用して ID プロバイダ (またはユーザー) からのトークンの提供を要求します。この例は、事前定義されている自己発行 (個人用) カードのセットの一部です。 |
ボタンをクリックすると、CardSpace ID セレクタが表示されます。ユーザーはこれを使用して、送信する CardSpace ID を選択できます。
[はい、カードの送信を選択します] をクリックします。システム内にカードが存在しない場合は、ID セレクタでカードを作成またはインポートできます。
[新しい個人用カードの作成] をクリックすると、自己発行カードの作成用画面が表示されます。
必須項目を入力して画像を選択し、カードに名前を付けたら、[保存] をクリックします。表示されたクレームを満たす個人用カードが作成されたら、そのカードを送信します。
暗号化されたカード データは、C# では次のように login1.aspx ページに送信されます。
<%@ 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>
暗号化されたカード データは、VB.net では次のように login1.aspx ページに送信されます。
<%@ 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>
login1.aspx ページにより、暗号化されたトークンが再度画面に表示されます。
ID セレクタを必要に応じてアクティブ化する
このサンプルでは、ID セレクタをより柔軟に表示する方法を示します。サンプルでは、次のファイルを使用します。
Sample2.htm
Login2.aspx
開発者にとっては、ID セレクタの呼び出しのタイミングと処理について、より柔軟性が必要な場合があります。特定のアプリケーションにより適した ID セレクタを一度に表示するには、<object>
要素をスクリプト化して、要求に応じて暗号化されたトークンを返します。次の Sample2.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 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>
<object>
要素は HTML ドキュメントのヘッダーに配置され、値プロパティへのアクセスが発生すると ID セレクタが呼び出されます。この例のスクリプトでは、トークン XML は <textarea>
要素に配置されています。この要素により、開発者は内容を表示した後で <form>
を送信できます。
メモ : |
---|
テキスト領域内のトークン テキストは |
クレームへのアクセス
このサンプルでは、TokenProcessor.cs
を使用して、Web サイトに送信されたカード内のクレームにアクセスする方法を示します。サンプルでは、次のファイルを使用します。
Sample3.htm
Login3.aspx
app_code\TokenProcessor.cs
Web.config
暗号化されたデータから取り出されたクレームを処理するには、ASP.NET 2.0 を使用している場合、開発者はこの演習の TokenProcessor.cs
のサンプル コードを使用できます。Token
クラスは Windows Communication Foundation (WCF) クラスを使用して、すべてのトークンの復号化と検証を処理します。Token
クラスは、ポストの対象ページ内で使用されます。C# の場合、ここでは login3.aspx ページは次のようになります。
<%@ 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>
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>
トークンからクレームの値を取得するには、Claims
プロパティを使用します。これによってクレームの URI がパラメータとして取得され、string
型の値として返されます。自己発行カードの URI はこのドキュメントの後半に一覧表示されていますが、時間を節約するため、SelfIssued
クラスで事前定義されています。
Token
クラスと共に使用される設定データがあります。Web.config ファイルには、次のような設定アイテムがあります。
<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>
要素 | 値 | 説明 |
---|---|---|
|
60 |
(省略可能) クライアントとサーバーの時間のずれが許容される最大秒数。 |
|
<なし> |
(省略可能) トークンの復号化に使用する証明書のサムプリント。このトークン クラスは、証明書を自動的に検索します。 |
|
My |
(省略可能) SSL 証明書のストアの名前。通常は "My" に設定します。 |
|
LocalMachine |
(省略可能) SSL 証明書のストアの場所。通常は "LocalMachine" に設定します。 |
|
PPID |
(省略可能) ユーザーを一意に特定するクレームとして使用される、クレームの種類の URI。 |
トークンがログイン ページにポストされて復号化されると、クレームの値が表示されるようになります。
ユーザーを一意に特定する
このサンプルでは、Token
クラスを使用してユーザーを一意に特定する方法を示します。このサンプルでは、次のファイルを使用します。
Sample4.htm
Login4.aspx
app_code\TokenProcessor.cs
web.config
このクレームと同じ値を持つカードを作成できる任意のユーザーがいる場合は、自己発行のクレームの値を特定する以外に、カードを一意に特定できることが必要です。これを行うには、カードの UniqueID
を計算します。この UniqueID
は、発行者の公開キーとその発行者に対する固有のクレームのハッシュです。クライアントとサーバー間の通信で使用されるキーは、最初の通信でランダムに生成されるため、公開キーはカードに固有です。同じ自己発行カードを複数のサイトで使用した場合は、新しい関連付けが行われるたびに新しいキー ペアが生成されます。この固有のクレームにおいて、カードの PPID (Private Personal Identifier) はその発行者に固有です。UniqueID
プロパティでは、開発者用にこのハッシュ値が計算されます。C# では、次のように login4.aspx ページにコードが追加されます。
<%@ 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>
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>
結果は、20 文字の、base-64 でエンコードされたハッシュ値になります。この値は、閲覧者を一意に特定するためにデータベース内で使用されます。
一意に特定するために使用されるクレームを変更するには、次のキーを Web.config に追加して、値を別のクレーム URI に変更します。
<add key="IdentityClaimType" value="https://schemas.xmlsoap.org/ws/2005/05/identity/claims/privatepersonalidentifier"/>
実際のトークンについて
暗号化された XML トークンの形式および利用の詳細については、次のドキュメントを参照してください。
https://go.microsoft.com/fwlink/?LinkId=95951
自己発行カード内のクレーム
名 = "https://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname";
電子メール アドレス = "https://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress";
姓 = "https://schemas.xmlsoap.org/ws/2005/05/identity/claims/surname";
番地 = "https://schemas.xmlsoap.org/ws/2005/05/identity/claims/streetaddress";
市区町村 = "https://schemas.xmlsoap.org/ws/2005/05/identity/claims/locality";
都道府県 = "https://schemas.xmlsoap.org/ws/2005/05/identity/claims/stateorprovince";
郵便番号 = "https://schemas.xmlsoap.org/ws/2005/05/identity/claims/postalcode";
国 = "https://schemas.xmlsoap.org/ws/2005/05/identity/claims/country";
自宅電話 = "https://schemas.xmlsoap.org/ws/2005/05/identity/claims/homephone";
その他の電話 = "https://schemas.xmlsoap.org/ws/2005/05/identity/claims/otherphone";
携帯電話 = "https://schemas.xmlsoap.org/ws/2005/05/identity/claims/mobilephone";
誕生日 = "https://schemas.xmlsoap.org/ws/2005/05/identity/claims/dateofbirth";
性別 = "https://schemas.xmlsoap.org/ws/2005/05/identity/claims/gender";
PPID = "https://schemas.xmlsoap.org/ws/2005/05/identity/claims/privatepersonalidentifier";
Web サイト = "https://schemas.xmlsoap.org/ws/2005/05/identity/claims/website";
用語集
ID プロバイダ - サブジェクト (個人) に関するクレームをアサートする機関 (会社、Web サイト、組織、ユーザー自身など)。
ID セレクタ - ユーザーのさまざまなデジタル ID を表し、証明書利用者に送信する適切なデジタル ID を選択できるようにするダイアログ。
証明書利用者 - サブジェクトが提示するクレームに依存する機関 (Web サイト、サーバー、または他の利用者)。
サブジェクト - 自身の ID に関するクレームを作成してもらうエンティティ (ユーザー)。サブジェクトのデジタル ID 情報の証明書利用者への解放は、常にサブジェクト自体が制御します。
このトピックに関するコメントを Microsoft に送信する。
Copyright © 2007 by Microsoft Corporation.All rights reserved.