Internet Explorer 7.0 で Windows CardSpace を使用する方法

Download sample

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 セレクタが表示されます。

オブジェクト要素の重要な要素は、次のとおりです。

要素 説明

type="application/x-informationcard"

ID セレクタ オブジェクトの表示をブラウザに指示します。

param name="tokenType"

ID セレクタが送出するトークンの種類を制御します。ここでは SAML 1.0 トークンです。

param name="issuer"

ID を提供する ID プロバイダ の URL です。ここでは、組み込みの自己発行プロバイダを呼び出す組み込み URI です。

param name="requiredClaims"

証明書利用者はユーザーに対し、特定のクレームを使用して ID プロバイダ (またはユーザー) からのトークンの提供を要求します。この例は、事前定義されている自己発行 (個人用) カードのセットの一部です。

ボタンをクリックすると、CardSpace ID セレクタが表示されます。ユーザーはこれを使用して、送信する CardSpace ID を選択できます。

Windows CardSpce カードの選択

[はい、カードの送信を選択します] をクリックします。システム内にカードが存在しない場合は、ID セレクタでカードを作成またはインポートできます。

Internet Explorer 7.0 での Windows CardSpace の使用

[新しい個人用カードの作成] をクリックすると、自己発行カードの作成用画面が表示されます。

Windows CardSpace カードの編集

必須項目を入力して画像を選択し、カードに名前を付けたら、[保存] をクリックします。表示されたクレームを満たす個人用カードが作成されたら、そのカードを送信します。

サイトへの Windows CardSpace カードの送信

暗号化されたカード データは、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 ページにより、暗号化されたトークンが再度画面に表示されます。

Internet Explorer 7.0 での Windows CardSpace の使用

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> を送信できます。

Noteメモ :

テキスト領域内のトークン テキストは login2.aspx ページ内のトークン テキストに、完全には一致しません。ブラウザでは XML タグが非表示であるためです。

クレームへのアクセス

このサンプルでは、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>
要素 説明

MaximumClockSkew

60

(省略可能) クライアントとサーバーの時間のずれが許容される最大秒数。

CertificateThumbprint

<なし>

(省略可能) トークンの復号化に使用する証明書のサムプリント。このトークン クラスは、証明書を自動的に検索します。

StoreName

My

(省略可能) SSL 証明書のストアの名前。通常は "My" に設定します。

StoreLocation

LocalMachine

(省略可能) SSL 証明書のストアの場所。通常は "LocalMachine" に設定します。

IdentityClaimType

PPID

(省略可能) ユーザーを一意に特定するクレームとして使用される、クレームの種類の URI。

トークンがログイン ページにポストされて復号化されると、クレームの値が表示されるようになります。

Internet Explorer 7.0 での Windows CardSpace の使用

ユーザーを一意に特定する

このサンプルでは、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 でエンコードされたハッシュ値になります。この値は、閲覧者を一意に特定するためにデータベース内で使用されます。

Internet Explorer 7.0 での Windows CardSpace の使用

一意に特定するために使用されるクレームを変更するには、次のキーを 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 情報の証明書利用者への解放は、常にサブジェクト自体が制御します。

Footer image

このトピックに関するコメントを Microsoft に送信する。

Copyright © 2007 by Microsoft Corporation.All rights reserved.