最終更新日 2005 年 11 月 14 日

このコンテンツのポイント

  • Web サービスでの基本認証の使用方法について理解する。
  • クライアント サイドからの、認証情報の設定方法について理解する。
  • サーバー サイドでの、コードによる認証情報の参照方法について理解する。

今回紹介するコード

<Service.cs>

C#
[WebMethod]
public string Hello()
{
    return "こんにちは " + Context.User.Identity.Name + " さん"; 
}
 

<Form1.cs>

C#
private void button1_Click(object sender, EventArgs e)
{
    WSAuth. Service ws = new WSAuth. Service ();
    ws.Credentials = new System.Net. NetworkCredential (textBox1.Text, textBox2.Text);
    string msg;
    msg = ws.Hello();
    MessageBox.Show(msg);
}
 

今回のシステム要件

  • Visual Studio 2005 Beta 2
  • IIS (インターネット インフォメーション サービス) 5.x または 6.0

目次

はじめに
作成するアプリケーションの概要
Web サービスの作成
Web サービス クライアントの作成
Web サービスへの基本認証の設定
動作と解説
おわりに
補足情報

Visual Basic の内容はこちらに掲載しています。
10 行でズバリ!! Web サービスの認証 (VB)

はじめに

ASP.NET Web サービスでは、セキュリティを強化する様々な方法が提供されています。ここでは、クライアント アプリケーションから Web サービスにアクセスするとき、基本認証を使用してログインを行う方法を取り上げます。

なお、Webサービスの基本的な開発方法についての説明は割愛しています。基本的な開発方法については、「 10 行でズバリ !! ASP.NET による Web サービスの開発 (C#)」および「 10 行でズバリ !! Web サービス クライアント アプリケーションの開発 (C#)」 をご覧ください。

作成するアプリケーションの概要

今回のサンプルでは、 基本認証を使用する Web サービスと、その Web サービスにアクセスするクライアントの二つのアプリケーションを作成します。

Web サービスのクライアントでは、NetworkCredential クラスを使用して、ユーザー名およびパスワードを設定し Web サービスを呼び出します。

呼び出された Web サービス側では、基本認証を行い、認証済みのユーザー情報を文字列として返します。

Web サービスの作成

まず、新規にWebサイトを作成します。Visual Studio 2005 の [ファイル] メニューをクリックし、[新規作成] をポイントして、[Web サイト]をクリックします。 すると、[新しい Web サイト] ダイアログボックスが表示されます。

ここでは、[言語] ドロップダウンリストから Visual C# を選択し、テンプレートとして 「ASP.NET Web サービス」 を選択します。 [場所] 欄では、ドロップダウン リストで 「HTTP」を選択します。アドレスとして、任意の仮想ディレクトリ名を指定します (たとえば、 「http://localhost/WSAuth」 など)。(図 1)

Visual Studio 2005 では、あらかじめローカル ディスクにWeb サービスを作成し、後から IIS 上に配置することもできますが、ここでは手順を簡単にするため、直接 IIS 上に作成します。そのため、[場所] 欄のドロップダウン リストでは、「HTTP」を選択する点に注意してください。

設定が済んだら、[OK] をクリックします。

図 1. ASP.NET Web サービスの Web サイトを新規に作成する

Web サービスが作成されると、Service.cs ファイルのコード エディタが開きます。(もし、エディタを閉じてしまった場合は、ソリューション エクスプローラ上の App_Code フォルダの配下にある Service.cs をダブルクリックすれば、再度エディタを開くことができます。)

既に HelloWord メソッドが記述されているので、このメソッドを以下のような Hello メソッドに書き換えます。

C#
[WebMethod]
public string Hello()
{
    return "こんにちは " + Context.User.Identity.Name + " さん"; 
}
 

ここでは、Web サービス クラスの Context プロパティを参照しています。この Context プロパティは、現在の実行環境下の様々な情報を参照できるオブジェクトです。ここのコードでは、このオブジェクトの User プロパティを調べて、現在認証されているユーザー情報を取得しています。User.Identity.Nameプロパティを調べることで、現在認証されて いるユーザー名が分かります。この Hello メソッドでは、そのユーザー名を含む文字列を戻り値として返しています。

コードの記述が完了したら、[ビルド] メニューの [Webサイトのビルド] をクリックし、 Web サービスをビルドして、コンパイル エラーがないことを確認します。

Web サービス クライアントの作成

Web サービス クライアント として、今回は Windows アプリケーション を作成します。そもそも、Web サービスのプロジェクトと、そのクライアントのプロジェクトは、同一のソリューションに含める必要はありませんが、ここでは一度に二つのプロジェクトを開 いていたほうがプログラムの確認をやりやすいので、現在使用しているソリューションに Windows アプリケーションプロジェクトを追加することにします。

[ファイル] メニューの [追加] をポイントし、[新しいプロジェクト] をクリックします。[新しいプロジェクトの追加] ダイアログ ボックスが表示されるので、プロジェクトの種類として [Visual C#] を選択し、テンプレートとして [Windows アプリケーション] を選択します。プロジェクト名は任意の名前を指定します(たとえば、ClientCS)。(図 2)

設定が済んだら、[OK] をクリックします。

図 2. Windows アプリケーション プロジェクトを追加する

新しく追加された Windows フォーム (Form1.cs) に TextBox コントロールを二つ、Buttonコントロールを一つ、図 3 と同じになるよう配置します。Button の Text プロパティは、「Hello」に変更します。

図 3. Windows フォームの画面をデザインする

次に、Web サービスにアクセスできるよう、「Web 参照の追加」を行います。

ソリューション エクスプローラ上で、クライアント アプリケーション プロジェクト (この例では ClientCS) のノードをクリックして選択した状態にします。ここで、メニュー バーの [プロジェクト] メニューにある、[Web 参照の追加] をクリックします。

すると、図4 のような [Web 参照の追加] ダイアログ ボックスが表示されるので、[URL] 欄に以下のアドレスを入力して、右端の [移動] ボタンをクリックします。(まだ、[参照の追加] ボタンは押さないでください。)

http://localhost/WSAuth/Service.asmx?wsdl


[参照名] ボックスでは、「WSAuth」と指定します。

図 4. Web参照の追加を行う

設定が済んだら、[参照の追加] ボタンを押します。

これで、Web サービスにアクセスするためのプロキシ クラスが生成されました。なお、プロキシ クラスのソースコードのファイルは、既定の設定では、ソリューション エスクプローラに表示されません。ソリューション エクスプローラの上部にある [すべてのファイルを表示] ボタンを押すことで、表示できます。(ソリューション エクスプローラ内の選択項目によって、ボタンの並びが変わるので注意してください。ボタンの名前は、マウスポインタをボタンの上に置くことで分かるので確 認してみてください。) プロキシ クラスは、Reference.cs というファイルの中に記述されています。

図 5. Reference.cs が作成される

Form1.cs の Windows フォーム デザイナに戻り、デザイナ上で [Hello] ボタンをダブルクリックし、Button1_Click イベント ハンドラを生成します。プロキシ クラスをインスタンス化し、Hello メソッドを呼び出す以下のコードを入力します。

C#
private void button1_Click(object sender, EventArgs e)
{
    WSAuth. Service ws = new WSAuth. Service ();
    ws.Credentials = new System.Net. NetworkCredential (textBox1.Text, textBox2.Text);
    string msg;
    msg = ws.Hello();
    MessageBox.Show(msg);
}
 

このコードでは、プロキシ クラスの Credentials プロパティへ、ログインに必要な認証情報を設定しています。認証情報は、NetworkCredential クラスとして表現することができます。このクラスのインスタンス作成時に渡された二つの引数は、ユーザー名とパスワードです・

その後の行では、Hello メソッドを呼び出し、結果をメッセージ ボックスへ表示します。

Web サービスへの基本認証の設定

今回作成した Web サービスに基本認証の設定を行います。

スタートメニューの [すべてのプログラム] をクリックし、[管理ツール] から [インターネット インフォメーション サービス] をクリックして、IIS の管理ツールを起動します。

左ペインのツリーには、今回作成した Web サービスの仮想ディレクトリ (ここではWSAuth) があるはずです。(図 6)

図 6. Web サービスの仮想ディレクトリが作成されている

ここで、左ペインのツリー上にある WSAuth ディレクトリを右クリックし、[プロパティ] をクリックします。このディレクトリのプロパティ ダイアログ ボックスが表示されるので、[ディレクトリ セキュリティ] タブをクリックします。(図 7)

図 7.WSAuth 仮想ディレクトリのプロパティ

次に、[匿名アクセスおよび認証コントロール] グループボックス内の [編集] ボタンをクリックします。図8の[認証方法] ダイアログ ボックスが表示されるので、[基本認証] チェックボックスのみチェックします。[基本認証]をチェックした際に、図 9の警告ダイアログが表示されますが、ここでは [はい] をクリックします。

図 8. 基本認証のみ指定する

図 9. 基本認証を選択した際に、警告ダイアログが表示される

 

今回の例では基本認証を使用する際に、ユーザー名およびパスワードなどの認証情報をクリア テキストとして渡していますが、実際に基本認証を使用する場合は、SSL 通信などを併せて使用します。

IIS にて SSL 通信を使用する場合は、サーバー証明書などの設定が必要となります。

サーバー証明書などの詳細の設定については、下記の資料をご参照ください。

セキュリティテスト用 SSL サーバーの構築 - ステップ バイ ステップ

なお、今回のサンプルプログラムにて SSL を使用する場合は、クライアント側で指定するWeb サービスの URL を http から https へ変更する必要があります。

 

動作と解説

サンプル プログラムを実行する前に、Windows アプリケーションをスタートアップ プロジェクトに設定します。一つのソリューションに複数のプロジェクトがあるとき、明示的に特定のプロジェクトをスタートアップ プロジェクトに設定することで、Visual Studio のメニューから、そのプロジェクトを起動できるようになります。

ソリューション エクスプローラ上の Windows アプリケーション プロジェクト名 (ここでは ClientCS) を右クリックして、[スタートアップ プロジェクトに設定] をクリックします。スタートアップ プロジェクトに設定すると、そのプロジェクト名は太字で表示されます。(図10)

図 10. クライアント プロジェクト ClientCS をスタートアップ プロジェクトに設定する

ここで、クライアント アプリケーションを実行します。 [Ctrl+F5] キーを押すか、[デバッグ] メニューの [デバッグなしで開始] をクリックします。はじめに、クリアテキストで送信する警告メッセージが表示されますが、ここでは [はい] をクリックします。

図 11. クリアテキストで送信される警告メッセージが表示される

この後、Form1 フォームが表示されるので、Web サービスが動作するマシンでログインが可能なユーザー名とパスワードをテキストボックスに指定します。(図 12)

図 12. ユーザー名とパスワードを指定する

[Hello] ボタンをクリックして、Web サービスにアクセスします。

Web サービス側で正しく認証が行われた場合は、下記のように Web サービスからの戻り値がメッセージボックスに表示されます。(図 13)

図 13. Web サービスからの戻り値が表示される

[OK] をクリックして、メッセージボックスを閉じます。

今度は、Form1 で無効なユーザー アカウントを指定して、[Hello] ボタンをクリックします。すると、以下のようなエラー メッセージが表示されます。(図14) 認証に失敗しました。

図 14. 認証に失敗するとエラー メッセージが表示される

[終了] ボタンをクリックして、アプリケーションを終了します。

おわりに

このように ASP.NET の Web サービスには、認証を行う仕組みが用意されており、クライアントから Web サービスにログインするためのクラス ライブラリも用意されています。

今回ご紹介した基本認証以外の認証方式の情報については、下記の資料を参照してください。

ASP.NET を使用して作成した XML Web サービスのセキュリティ

Web サービスの場合も Web アプリケーションと同様に、認証情報を元にした URL 承認やプログラムによる承認などを実装することも可能ですので、この機会に是非チャレンジしてみて下さい。

補足情報

Web サービスでは WS-Security というセキュリティ仕様が存在します。WS-Security では認証や暗号化、署名に関する仕様が定義されています。詳しくは、以下の資料を参照してください。

WS-Security 入門 


Code Recipe .NET Framework デベロッパー センター

ページのトップへ