連載
» 2004年12月28日 00時00分 公開

ODP.NETファーストステップ(2):ASP.NETの利点を引き出すODP.NET活用法 (3/4)

[大田浩,日本オラクル]

プロキシ認証で柔軟なアクセス制御を実現する

 ASP.NETもしくはXML Webサービスを利用した3層アプリケーションでは、通常中間層から共通のユーザーでデータベースに接続しますが、これでは個々のユーザーごとにデータベースへのアクセス制御や監査は行えません。プロキシ認証を利用すると、接続のためのユーザーは共有しますが、データベースのアクセス権限などは、個々のユーザーごとに実施することが可能になります。

図4 3層アプリケーションでのコネクションの共有 図4 3層アプリケーションでのコネクションの共有

ASP.NETでプロキシ認証の設定

 Visual Studio .NETでプログラミングする前に、データベース上でプロキシ認証を利用するための設定が必要になります。データベースの設定に関しては、下記のスクリプトをダウンロードし、SQL*Plusなどのツールから実行してください。

 ・プロキシ認証を利用するためのスクリプト

 スクリプトを実行すると、以下のユーザーが作成されます。

ユーザー名 説明
custuser テーブルなどオブジェクトを所有しているユーザー
custproxy データベースに接続するためのプロキシユーザー
staff custuserが所有しているオブジェクトに対して参照権限のみ付与されたユーザー
manager custuserが所有しているオブジェクトに対して参照/更新権限が付与されたユーザー
表4 スクリプトによって作成されるユーザー

プロキシ認証を利用した接続

 ASP.NETからプロキシ認証を利用して接続するには、以下のような接続文字列を使用します。

Dim cnn As New OracleConnection

cnn.ConnectionString = _
  "User Id=staff;Password=staff;Data Source=orcl;" + _
  "Proxy User Id=custproxy;Proxy Password=custpass"
cnn.Open()
リスト9 プロキシ認証を使用して接続するサンプルコード(VB.NET)

OracleConnection cnn = new OracleConnection();

cnn.ConnectionString = 
  "User Id=staff;Password=staff;Data Source=orcl;" +
  "Proxy User Id=custproxy;Proxy Password=custpass";
cnn.Open();
リスト10 プロキシ認証を使用して接続するサンプルコード(C#)

 それでは、staffユーザーで更新を行ってみます。

Dim cnn As New OracleConnection
Dim cmd As New OracleCommand

cnn.ConnectionString = _
  "User Id=staff;Password=staff;Data Source=orcl;" + _
  "Proxy User Id=custproxy;Proxy Password=custpass"
cnn.Open()
cmd.Connection = cnn
cmd.CommandText = _
  "update custuser.customer set tel='999-9999' " + _
  "where customerid='002'"
cmd.ExecuteNonQuery()

cnn.Close()
リスト11 プロキシ認証を行ってcustomerテーブルを更新するサンプルコード(VB.NET)

OracleConnection cnn = new OracleConnection();
OracleCommand cmd = new OracleCommand();

cnn.ConnectionString = 
  "User Id=staff;Password=staff;Data Source=orcl;" +
  "Proxy User Id=custproxy;Proxy Password=custpass";
cnn.Open();
cmd.Connection = cnn;
cmd.CommandText = 
  "update custuser.customer set tel='999-9999' " + 
  "where customerid='002'";
cmd.ExecuteNonQuery();

cnn.Close();
リスト12 プロキシ認証を行ってcustomerテーブルを更新するサンプルコード(C#)

 staffユーザーはcustomerテーブルに対してSELECT権限しかないので、以下のようなエラーが出力されます。

図5 権限がないために発生したエラー画面(クリックすると拡大します) 図5 権限がないために発生したエラー画面(クリックすると拡大します)

 次にmanagerユーザーに変更し、customerテーブルに対して更新処理を行ってみます。リスト11/リスト12のConnnectionStringを以下のように修正して実行します。

User Id=manager;Password=manager;Data Source=orcl;
Proxy User Id=custproxy;Proxy Password=custpass

 managerユーザーでは正常に更新されるのが確認できると思います。このようにプロキシ認証を行うと、データベースの権限をアプリケーションで享受可能になります。データベースで認証された利用者でなければデータへのアクセス権限がないので、より安全な接続環境を実現できます。

 また、データベース・ユーザーごとに監査を行うことが可能になります。Oracleのセキュリティに関する情報は、OTN(Oracle Technology Network)の「Documentation Library」で詳細な手順を説明していますので、そちらを参照してください。

 今回のサンプルではstaffユーザーでアクセスする際に、OracleのエラーがそのままWebフォーム上に表示されていますが、実際のアプリケーションではエラー情報を取得して適切に対処する必要があります。その場合は、OracleExceptionクラスを利用します。OracleExceptionで提供される、メンバー/メソッド/プロパティの一覧は、OTNの「Oracle Data Provider for .NET開発者ガイド」にて詳細に説明してありますので、そちらを参照してください。(次ページへ続く)

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。