ASP.NET セキュリティの概要
この記事では、ASP.NET セキュリティの概要について説明します。ここでは、次の Microsoft .NET Framework クラス ライブラリ名前空間を参照します。
System.Web.Security
System.Web.Principal
元の製品バージョン: ASP.NET
元の KB 番号: 306590
まとめ
ASP.NET を使用すると、アプリケーションのセキュリティを実装するための制御が強化されます。 ASP.NET セキュリティは、インターネット インフォメーション サービス (IIS) セキュリティと組み合わせて動作し、ASP.NET セキュリティ モデルを実装するための認証および承認サービスが含まれています。 ASP.NET には、Windows ユーザー アカウントと Windows 以外のユーザー アカウントの両方に実装できるロールベースのセキュリティ機能も含まれています。
この記事は、次のセクションに分かれています。
要求を使用したセキュリティのフロー
次の手順では、クライアントが要求を行うときの一連のイベントの概要を示します。
- クライアントは、IIS サーバー上に存在する.aspx ページを要求します。
- クライアントの資格情報は IIS に渡されます。
- IIS はクライアントを認証し、認証されたトークンとクライアントの要求を ASP.NET ワーカー プロセスに転送します。
- IIS から認証されたトークンと Web アプリケーションの構成設定に基づいて、ASP.NET は要求を処理しているスレッドでユーザーを偽装するかどうかを決定します。 Active Server Pages (ASP) と ASP.NET の違いにより、ASP.NET は認証されたユーザーを既定で偽装しなくなります。 偽装を有効にするには、 Web.config ファイルの id セクションの偽装属性を true に設定する必要があります。
セキュリティ フローの詳細については、「 ASP.NET データ フローを参照してください。
ASP.NET での偽装の詳細については、「 ASP.NET アプリケーションで偽装を実装する方法を参照してください。
関連する構成設定
IIS は、IIS メタベースにセキュリティ関連の構成設定を保持します。 ただし、ASP.NET では、拡張マークアップ言語 (XML) 構成ファイルのセキュリティ (およびその他) 構成設定が維持されます。 これにより、一般的にセキュリティの観点からアプリケーションのデプロイが簡略化されますが、アプリケーションが採用するセキュリティ モデルでは、構成ファイル (Web.config を使用して、IIS メタベースと ASP.NET アプリケーションの両方の正しい構成が必要になります。
次の構成セクションは、ASP.NET セキュリティに関連しています。
認証
認証とは、ユーザーの名前やパスワードなどの識別資格情報を取得し、その資格情報を何らかの機関に対して検証するプロセスです。
ASP.NET には、次の 4 つの認証プロバイダーが用意されています。
フォーム認証
フォーム認証とは、認証されていない要求が、ユーザーが資格情報を入力するハイパーテキスト マークアップ言語 (HTML) フォームにリダイレクトされるシステムを指します。 ユーザーが資格情報を入力してフォームを送信すると、アプリケーションは要求を認証し、システムは Cookie の形式で承認チケットを発行します。 この Cookie には、ID を取得するための資格情報またはキーが含まれています。 ブラウザーからの後続の要求には、Cookie が自動的に含まれます。
フォーム認証の詳細については、「 フォーム認証プロバイダー」を参照してください。
ASP.NET でのフォーム認証の詳細については、「 C#.NET を使用して ASP.NET アプリケーションにフォーム ベースの認証を実装する方法」を参照してください。
Windows 認証
Windows 認証では、IIS によって認証が実行され、認証されたトークンが ASP.NET ワーカー プロセスに転送されます。 Windows 認証を使用する利点は、最小限のコーディングが必要であるという点です。 Windows 認証を使用して、要求を ASP.NET に渡す前に、IIS が認証する Windows ユーザー アカウントを偽装することができます。
Windows 認証の詳細については、「WindowsAuthenticationModule プロバイダーを参照してください。
Passport 認証
Passport 認証は、Microsoft が提供する一元化された認証サービスであり、メンバー サイトのシングル サインインとコア プロファイル サービスを提供します。 通常、Passport 認証は、複数のドメインにまたがるシングル サインイン機能が必要な場合に使用されます。
Passport 認証の詳細については、「 Passport 認証プロバイダー」を参照してください。
既定の認証
既定の認証は、Web アプリケーションでセキュリティが必要ない場合に使用されます。このセキュリティ プロバイダーには匿名アクセスが必要です。 すべての認証プロバイダーの中で、既定の認証によってアプリケーションのパフォーマンスが最大になります。 この認証プロバイダーは、独自のカスタム セキュリティ モジュールを使用する場合にも使用されます。
承認
承認は、認証されたユーザーが要求されたリソースにアクセスできるかどうかを確認するプロセスです。
ASP.NET では、次の承認プロバイダーが提供されます。
ファイルの承認
FileAuthorizationModule
クラスはファイルの承認を実行し、Windows 認証を使用するとアクティブになります。 FileAuthorizationModule
は、ユーザーがアクセス権を持つ必要があるかどうかを判断するために、Windows アクセス制御リスト (ACL) のチェックを実行する役割を担います。
URL の承認
UrlAuthorizationModule
クラスは、URI (Uniform Resource Locator) 名前空間に基づいて承認を制御する UNIFORM Resource Locator (URL) 承認を実行します。 URI 名前空間は、NTFS アクセス許可で使用される物理フォルダーとファイル パスとは異なる場合があります。
UrlAuthorizationModule
正と負の両方の承認アサーションを実装します。つまり、モジュールを使用して、ユーザー、ロール (マネージャー、テスター、管理者など)、動詞 ( GET
や POST
など) の URI 名前空間の任意の部分へのアクセスを選択的に許可または拒否できます。
ASP.NET での承認の詳細については、「 ASP.NET 承認」を参照してください。
ロール ベースのセキュリティ
ASP.NET のロールベースのセキュリティは、Microsoft COM+ と Microsoft Transaction Server (MTS) が使用するロールベースのセキュリティに似ていますが、重要な違いがあります。 ASP.NET のロールベースのセキュリティは、Windows アカウントとグループに限定されません。 たとえば、Windows 認証と偽装が有効になっている場合、ユーザーの ID は Windows ID (User.Identity.Name = "Domain\username"
) になります。 特定のロールのメンバーシップの ID を確認し、それに応じてアクセスを制限できます。 例えば次が挙げられます。
Visual Basic .NET コード
If User.IsInRole("BUILTIN\Administrators") Then
Response.Write("You are an Admin")
Else If User.IsInRole("BUILTIN\Users") then
Response.Write("You are a User")
Else
Response.Write("Invalid user")
End if
Visual C# .NET コード
if ( User.IsInRole("BUILTIN\\Administrators"))
Response.Write("You are an Admin");
else if (User.IsInRole("BUILTIN\\Users"))
Response.Write("You are a User");
else
Response.Write("Invalid user");
フォーム認証を使用している場合、ロールは認証されたユーザーに割り当てません。これをプログラムで行う必要があります。 認証されたユーザーにロールを割り当てるには、認証モジュールの OnAuthenticate
イベント (この例では Forms 認証モジュール) を使用して新しい GenericPrincipal
オブジェクトを作成し、 HttpContext
の User プロパティに割り当てます。 次のコードは、これを示しています。
Visual Basic .NET コード
Public Sub Application_AuthenticateRequest(s As Object, e As EventArgs)
If (Not(HttpContext.Current.User Is Nothing)) Then
If HttpContext.Current.User.Identity.AuthenticationType = "Forms" Then
Dim id as System.Web.Security.FormsIdentity = HttpContext.Current.User.Identity
Dim myRoles(3) As String
myRoles(0)= "managers"
myRoles(1)= "testers"
myRoles(2)= "developers"
HttpContext.Current.User = new System.Security.Principal.GenericPrincipal(id,myRoles)
End If
End If
End Sub
Visual C# .NET コード
public void Application_AuthenticateRequest(Object s, EventArgs e)
{
if (HttpContext.Current.User != null)
{
if (HttpContext.Current.User.Identity.AuthenticationType == "Forms" )
{
System.Web.Security.FormsIdentity id = HttpContext.Current.User.Identity;
String[] myRoles = new String[3];
myRoles[0]= "managers";
myRoles[1]= "testers";
myRoles[2]= "developers";
HttpContext.Current.User = new System.Security.Principal.GenericPrincipal(id,myRoles);
}
}
}
ユーザーが特定のロールに含まれているかどうかを確認し、それに応じてアクセスを制限するには、.aspx ページで次のコード (または同様) を使用します。
Visual Basic .NET コード
If User.IsInRole("managers") Then
Response.Write("You are a Manager")
Else If User.IsInRole("testers") Then
Response.Write("You are a Tester")
Else If User.IsInRole("developers") Then
Response.Write("You are a Developer")
End if
Visual C# .NET コード
if (User.IsInRole("managers"))
Response.Write("You are a Manager");
else if (User.IsInRole("testers"))
Response.Write("You are a Tester");
else if (User.IsInRole("developers"))
Response.Write("You are a Developer");
ロールベースのセキュリティの詳細については、「 Role ベースのセキュリティ」を参照してください。
関連情報
ASP.NET の一般的な情報については、次のニュースグループを参照してください。
詳細については、次の記事または書籍を参照してください。
PRB: Request.ServerVariables("LOGON_USER") は、ASP.NET で空の文字列を返します
Reilly、ダグラス J. Microsoft ASP.NET アプリケーションの設計。 Microsoft Press、2001。
Esposito、Dino。 ASP.NET と ADO.NET を使用して Web ソリューションを構築する。 Microsoft Press、2001。