連載
Enterprise Library概説

柔軟なセキュリティ機能を実装しよう

―― AzManを利用したルールベースのセキュリティ機能を提供する「Security Application Block」 ――

アバナード株式会社 市川 龍太(patterns & practices Champion
2006/06/03
Page1 Page2 Page3

 前回では、「Updater Application Block 2.0」を使った自動更新機能について解説した。

 今回はロールベースのセキュリティ機能を提供する「Security Application Block」(以下SecurityAB)について解説する。なお、本連載ではいままでEnterprise Library(以下EntLib)1.1をベースに各Application Blockの解説を行ってきたが、2006年1月に.NET Framework 2.0に対応したEntLib 2.0がリリースされたこともあり、今回からはEntLib 2.0をベースにして解説していくことにする。

 さて、一口にセキュリティ機能といっても実際には「認証」と「認定」の2つの機能に大別される。

 認証とは呼び出し元の識別情報を特定すること、つまり対象ユーザーが確かに本人であることを確認することであり、認定とは認証された識別情報により実行できる動作とアクセス可能なリソースを決定すること、つまり対象ユーザーが要求する処理の実行可否を確認することである。ちなみに認定は英語ではAuthorizationと表記され、patterns & practicesやほかの技術記事などでは「許可制御」、「承認」などと訳されているが、本稿では認定と表現することにする(一方の認証はAuthenticationと表記される)。

ASP.NET 2.0セキュリティ機能

 SecurityABの解説に入る前に、ASP.NET 2.0で新しく実装された主なセキュリティ機能の中から「メンバシップ機能」と「ロール管理」について簡単に解説しよう。

■メンバシップ機能

 エンタープライズ・アプリケーションではユーザーの識別情報をSQL Serverのようなデータ・ストア内に格納し、認証時にアクセスするのが一般的である。

 しかし識別情報を格納するデータ・ストアは常にSQL ServerのようなRDBとは限らない。例えばディレクトリ・サービスXML形式ファイルなどが格納先のデータ・ストアとして挙げられることもあるだろう。このように識別情報を格納するデータ・ストアが複数挙げられる場合に、これらの格納先データ・ストアの違いを意識することなく認証機能を利用できるように実装することが、再利用の観点からも推奨される。

 ASP.NET 2.0のメンバシップ機能では、これらデータ・ストアの差異を利用側から隠ぺいするためにプロバイダ・モデル・パターン(以下プロバイダ・モデル)を採用している。ASP.NET 2.0が実装しているプロバイダ・モデルはアプリケーション側へ公開される「メンバシップ・サービスAPI」と、データ・ストアごとに用意される「メンバシップ・プロバイダ・コンポーネント」によって構成されている。

ASP.NET 2.0のメンバシップ機能を実現するプロバイダ・モデルの構成図
ADAMは「Active Directory Application Mode」の略で、通常のActive DirectoryのようにOSのシステム・レベルで提供されるディレクトリ・サービスではなく、Windowsドメインとは無関係に任意のインスタンスで利用可能な軽量なディレクトリ・サービスである(ドメイン・コントローラでなくても利用できる)。

 利用するプロバイダの設定はアプリケーション構成ファイル(WebアプリケーションならWeb.config)に記述することで、柔軟な設定の変更が可能であり、利用側はプロバイダを意識する必要はないのである。

 余談だがASP.NET 2.0にはこういった認証処理を行うログイン・ページを簡単に実装できるようにセキュリティ・コントロールが用意されている。本稿では詳しい解説は行わないが、詳細は「ASP.NET 2.0が変えるWebアプリ開発の世界 第3回 ASP.NET 2.0のログイン管理とウィザード・ページ」を参照するとよいだろう。

■ロール管理機能

 ASP.NET 2.0から提供されたロール管理機能は、基本的には先に解説したメンバシップ機能と同様にプロバイダ・モデルを使って実装されている。

 ロール管理機能を有効にすると、ASP.NET 2.0のランタイムはユーザー名を基に、対応するロール情報をプロバイダで定義されているデータ・ストアから取得してくれるので、あとはロール・マネージャAPIを使ってそのロール情報にアクセスすることができる。

ASP.NET 2.0のロール機能を実現するプロバイダ・モデルの構成図

 しかしこれらロール情報のリクエストの都度データ・ストアへアクセスしていたのではパフォーマンスに影響が出てしまうため、ASP.NET 2.0はクッキー上にロール情報をキャッシュする機能も提供している。

 ASP.NET 2.0にはこれらの機能以外にもDPAPI(Data Protection API:データ保護API)*1マネージ・ラッパーや構成ファイルの暗号化など、いくつかの機能が提供されている。先に解説したメンバシップ機能、ロール管理機能の詳細を知りたい場合は以下のURLを参考にするとよいだろう。

*1 DPAPIはWindows 2000以降で搭載されるWin32 API(crypt32.dll)で、データの暗号化と解読を行うためのもの。DPAPIは、CryptProtectData関数とCryptUnprotectData関数の2つで構成されている。

 以上を踏まえたうえで、これからSecurityABについて解説していくとしよう。

SecurityABが提供する認定機能

 SecurityABが提供するのは認定機能だけであり、認証機能については提供されていない。

 実はEntLib 1.1で提供されていたSecurityABには認証機能のほかにユーザー・プロファイル機能(ユーザー情報を参照する機能)も提供されていたのだが、先に解説したとおりASP.NET 2.0からは新しくメンバシップ機能が提供されたため、EntLib 2.0のSecurityABからは削除された。

 従ってSecurityABが提供する機能は以下の3つになる。

Authorization Rule Providerによるルールベースの認定機能
Authorization Managerを使用したAuthorization Providerによる認定機能
Caching Application Blockを利用したキャッシュ機能

 このうち、Authorization Manager(以下AzMan)を使ったの認定機能はASP.NET 2.0のロール管理機能からも(先ほどの「ASP.NET 2.0のロール機能を実現するプロバイダ・モデルの構成図」にもあったように)AuthorizationStoreRoleProviderクラスを使うことで同様の機能を利用することができる。AzManの詳細については後述する。

EntLib 2.0の認定機能を実現するプロバイダ・モデルの構成図
SecurityABが提供するのは認定機能だけであり、認証機能については提供されていない。Authorization Rule ProviderはAuthorizationRuleProviderクラスとして、AzMan Authorization ProviderはAzManAuthorizationProviderクラスとして実装されている。

 それでは各機能の利用手順について順に解説していくとしよう。


 INDEX
  連載:Enterprise Library概説
  柔軟なセキュリティ機能を実装しよう
  1.ASP.NET 2.0セキュリティ機能
    2.ルールベース認定機能の利用方法
    3.AzManを活用した認定機能の利用方法
 
インデックス・ページヘ  「Enterprise Library概説」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間