|   | 
          
 
            
|  
              
 .NET TIPS 
ユーザーのセキュリティ権限を簡単に確認するには?(応用編)
デジタルアドバンテージ 一色 政彦 
              2005/09/02 | 
  | 
          
 
            
 
              
 
             | 
        
 「TIPS:ユーザーのセキュリティ権限を確認するには?(基本編)」では、基本的なロールベース・セキュリティの実装方法を紹介した。これを行えば、アプリケーションを使用するユーザーのセキュリティ権限(例えば、Administratorsグループに所属しているかどうか)のチェック処理などを実装できるようになる。
 ただし、この方法では事前に「AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal)」というコードを呼び出さなければならない。このコードは、前掲のTIPSでも説明されているように、現在のアプリケーション・ドメインに対してプリンシパル(本稿の例では「WindowsPrincipal」)を設定するためのものだ。このコード呼び出しを行って、初めて現在のスレッドからプリンシパル(WindowsPrincipalオブジェクト)を取得できるようになる。
 実は.NET Frameworkにはもっと気軽にロールベース・セキュリティの情報を取得する方法が用意されている。本稿ではその方法を紹介する。それはプリンシパル(WindowsPrincipalオブジェクト)をスレッドに設定するのではなく、自らそれを生成する方法である。
 プリンシパルとなるWindowsPrincipalオブジェクトを生成するには、まずそのプリンシパルに結び付けるユーザーのアイデンティティ(WindowsIdentityオブジェクト)が必要になる。現在のアイデンティティを取得するには、WindowsIdentityクラス(System.Security.Principal名前空間)の静的メソッドであるGetCurrentメソッドを呼び出せばよい。その後、取得したWindowsIdentityオブジェクトをWindowsPrincipalクラスのコンストラクタ・パラメータに指定して、WindowsPrincipalオブジェクトを生成(new)すればよい。
 これを実際に実装しているのが、次のサンプル・プログラムである。このサンプル・プログラムでは、WindowsPrincipalオブジェクトを生成後、そのIdentityプロパティ(=アイデンティティ情報)やIsInRoleメソッド(=ロールへの所属の有無、権限の有無の情報)を使ってロールベース・セキュリティ情報を活用している。
 
using System; 
using System.Security.Principal; 
 
namespace ConsoleApplication1 
{ 
  class Class1 
  { 
    [STAThread] 
    static void Main(string[] args) 
    { 
      WindowsIdentity ident = WindowsIdentity.GetCurrent(); 
      WindowsPrincipal princ = new WindowsPrincipal(ident); 
 
      Console.WriteLine("ユーザー名:{0}", 
        princ.Identity.Name); 
      Console.WriteLine("Administrators権限の有無:{0}", 
        princ.IsInRole(WindowsBuiltInRole.Administrator)); 
      Console.WriteLine("Users権限の有無:{0}", 
        princ.IsInRole(WindowsBuiltInRole.User)); 
    } 
  } 
}
 | 
 
 
 
Imports System.Security.Principal 
 
Module Module1 
 
  Sub Main() 
    Dim ident As WindowsIdentity = WindowsIdentity.GetCurrent() 
    Dim princ As New WindowsPrincipal(ident) 
 
    Console.WriteLine("ユーザー名:{0}", _ 
      princ.Identity.Name) 
    Console.WriteLine("Administrators権限の有無:{0}", _ 
      princ.IsInRole(WindowsBuiltInRole.Administrator)) 
    Console.WriteLine("Users権限の有無:{0}", _ 
      princ.IsInRole(WindowsBuiltInRole.User)) 
  End Sub 
 
End Module
 | 
 
 
 | 
 
| ロールベース・セキュリティを実装したコンソール・アプリケーションのサンプル・プログラム(上:C#、下:VB.NET) | 
 コードの内容はあまり難しくないので、詳細な説明は割愛する。以下が上記のサンプル・プログラムの実行結果である。
 
ユーザー名:D-ADVANTAGE\masa-i 
Administrators権限の有無:True 
Users権限の有無:True
 | 
 
 
 | 
 
| サンプル・プログラム(コンソール・アプリケーション)の実行結果 | 
 以上が、ロールベース・セキュリティの情報を簡単に活用する手法だ。この方法ではプリンシパルを自ら生成するので制約が少なく利用が容易だが、複数のコード個所で繰り返しセキュリティ検証を行う場合には、オブジェクト生成のオーバーヘッドがある(オブジェクトが再利用されない)ので、あまりお勧めできない。やはり起動時に1回だけロールベースのセキュリティ検証を行う場合以外では、前掲のTIPSの手法を利用することをお勧めする。
          
 
            
カテゴリ:クラス・ライブラリ 処理対象:セキュリティ 
使用ライブラリ:WindowsIdentityクラス(System.Security.Principal名前空間) 
使用ライブラリ:WindowsPrincipalクラス(System.Security.Principal名前空間) 
関連TIPS:ユーザーのセキュリティ権限を確認するには?(基本編) | 
        
 
        
 
|  
 | 
 
generated by  
 | 
 
 
 | 
 
 
	
		Insider.NET 記事ランキング
		
		
			本日
			月間