更新日: 2009 年 11 月 10 日

Visual Basic の内容はこちらに掲載しています。 10 行でズバリ !! セキュリティ ロールに応じた制御 (ロールベース セキュリティ) (VB)

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

  • プリンシパル オブジェクト
  • 現在のスレッドのプリンシパル オブジェクトの取得
  • プリンシパル オブジェクトの IsInRole メソッドによる所属ロールの確認

今回紹介するコード

C#
static void Main(string[] args)
{
    AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal);
    IPrincipal prin = System.Threading.Thread.CurrentPrincipal;

    // Administrators ロールに属しているか評価
    if (prin.IsInRole("builtin\\Administrators"))
        Console.WriteLine("OK - 管理者ロールに属しています。");
    Else
        Console.WriteLine("NG - 管理者ロールに属していません。");
}
 

目次

  1. はじめに
  2. 作成するアプリケーションの概要
  3. コンソール アプリケーションの開発準備をする
  4. コードの実装
  5. 実行する
  6. おわりに

1. はじめに

ロールベース セキュリティとは、ユーザーが属する一種のグループである「ロール」に基づいて、セキュリティ制御を行う仕組みであり、.NET Framework が提供するものです。通常、ロールごとに異なるロジックを実装するときなどに使います。たとえば、一般社員ロールと課長ロールとでは、アプリケーションの振る舞いを変えたい場合などです。ロールは、Windows OS が提供するユーザー体系とは独立しており、アプリケーション固有のユーザー体系を構築することができます。また、ロールを Windows OS のユーザー グループにマッピングすることもできます。ロールベース セキュリティで使用されるロールやユーザーの識別子は、「プリンシパル オブジェクト」にカプセル化されています。ここでは、プリンシパル オブジェクトを用いた、ロールベース セキュリティの制御方法を解説します。

ページのトップへ


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

今回作成するのは、現在ログオンしているユーザーの情報をプリンシパル オブジェクトにマッピングさせ、そのユーザーが特定のロールに属しているか評価するコードを実装します。

.NET のアプリケーションでは、スレッドに 1 つずつプリンシパル オブジェクトを対応付けることができます。このプリンシパル オブジェクトは、そのスレッドを現在実行しているユーザーを表しています。このプリンシパル オブジェクトには、Windows ユーザー アカウントとは無関係の、アプリケーション独自のユーザー情報をプログラム コードから設定することができます。また、現在ログオンしているユーザー情報を元にプリンシパル オブジェクトを作り、それを現在のスレッドに割り振ることもできます。ここでは、後者の方法を使います。この方法を使うと、現在ログオンしているユーザーに関して、ロールベース セキュリティを用いたセキュリティ制御が実装できます。

ページのトップへ


3. コンソール アプリケーションの開発準備をする

Visual Studio を起動して、新規にプロジェクトを作成します ([ファイル] メニューの [新規作成] をポイントし、[プロジェクト] をクリックします)。

ここでは、プロジェクトの種類ペインで、[Visual C#] を選択し、テンプレート ペインでは [コンソール アプリケーション] を選択します。[プロジェクト名] ボックスに適当な名前を入力し、[場所] ボックスに適当なパスを指定したら、[OK] ボタンをクリックします。

これでロール検証を行うアプリケーションの開発準備が完了しました。

図 1. ロール検証を行うためのプロジェクトを新規に作成する

ページのトップへ


4. コードの実装

ソース コード内の他の using ディレクティブの下に、using ディレクティブを使用して System.Security.Principal 名前空間の使用を宣言します。この宣言によって、名前空間の修飾を省いたクラス名の表記だけで、この名前空間内のクラス名が使用可能になります。

C#
using System.Security.Principal;
 

次に、main メソッドの実装に移ります。

現在ログオンしている Windows ユーザーに基づいてプリンシパル オブジェクトを作り、現在のスレッドに関連付けるためには、現在のアプリケーション ドメインの SetPrincipalPolicy メソッドに次のような引数を渡して呼び出します。

C#
AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal);
 

次に、現在のスレッドに関連付いているプリンシパル オブジェクトを参照します。このプリンシパル オブジェクトには、現在ログオンしているユーザー情報が、自動的に設定されています。プリンシパル オブジェクトは、IPrincipal 型の変数として表すことができます。

C#
IPrincipal prin = System.Threading.Thread.CurrentPrincipal;
 

最後に、プリンシパル オブジェクトの IsInRole メソッドを使って、特定のロールに属しているかを評価します。今回は、Windows ユーザー グループがマッピングされているので、この例では、「builtin\Administrators」という Windows の管理者グループをロールとして使っています。

C#
// Administrators ロールに属しているか評価
if (prin.IsInRole("builtin\\Administrators"))
    Console.WriteLine("OK - 管理者ロールに属しています。");
Else
    Console.WriteLine("NG - 管理者ロールに属していません。");
 

ページのトップへ


5. 実行する

コードの記述が完了したら、実行してみましょう。

[デバッグ] メニューの [デバッグなしで開始] をクリックします。コンソール画面が表示されロール検証の評価結果が確認できます。

図 2. アプリケーションを実行する

ページのトップへ


6. おわりに

今回は、Windows ユーザー アカウントを利用した場合の、ロールベース セキュリティを紹介しましたが、独自のプリンシパル オブジェクトを作成し、Thread クラスの CurrentPrincipal プロパティに代入して、直接スレッドに関連付けることもできます。

この場合は、GenericPrincipal クラスを使って、任意のプリンシパル オブジェクトを作成します。また、ASP.NET を利用した Web アプリケーションでは、ASP.NET 上で認証されたユーザーが、自動的に現在のスレッドのプリンシパル オブジェクトにマッピングされます。このように、様々な形態でプリンシパル オブジェクトは利用され、様々な状況でロールベース セキュリティを利用することができます。


Code Recipe

ページのトップへ