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 以外のユーザー アカウントの両方に実装できるロールベースのセキュリティ機能も含まれています。

この記事は、次のセクションに分かれています。

要求を使用したセキュリティのフロー

次の手順では、クライアントが要求を行うときのイベントのシーケンスについて説明します。

  1. クライアントは、IIS サーバー上にある.aspx ページを要求します。
  2. クライアントの資格情報は IIS に渡されます。
  3. IIS はクライアントを認証し、認証されたトークンとクライアントの要求を ASP.NET ワーカー プロセスに転送します。
  4. IIS からの認証されたトークンと Web アプリケーションの構成設定に基づいて、ASP.NET は、要求を処理しているスレッドでユーザーを偽装するかどうかを決定します。 Active Server Pages (ASP) と ASP.NET の違いにより、ASP.NET は認証されたユーザーを既定で偽装しなくなります。 偽装を有効にするには、 Web.config ファイルの ID セクションの偽装属性を true に設定する必要があります。

セキュリティ フローの詳細については、「ASP.NET Data Flow」を参照してください。

ASP.NET での偽装の詳細については、「ASP.NET アプリケーションで偽装を実装する方法」を参照してください。

IIS では、IIS メタベースにセキュリティ関連の構成設定が保持されます。 ただし、ASP.NET は、拡張マークアップ言語 (XML) 構成ファイルのセキュリティ (およびその他) の構成設定を維持します。 これにより一般に、セキュリティの観点からアプリケーションのデプロイが簡略化されますが、アプリケーションが採用するセキュリティ モデルでは、IIS メタベースと ASP.NET アプリケーションの両方の正しい構成が、その構成ファイル (Web.config) を通じて必要になります。

次の構成セクションは、ASP.NET セキュリティに関連しています。

認証

認証は、ユーザーの名前やパスワードなどの識別資格情報を取得し、その資格情報を何らかの機関に対して検証するプロセスです。

ASP.NET には、次の 4 つの認証プロバイダーが用意されています。

フォーム認証

フォーム認証とは、認証されていない要求が、ユーザーが資格情報を入力する Hypertext Markup Language (HTML) フォームにリダイレクトされるシステムを指します。 ユーザーが資格情報を提供し、フォームを送信すると、アプリケーションは要求を認証し、システムは Cookie の形式で承認チケットを発行します。 この Cookie には、ID を再取得するための資格情報またはキーが含まれています。 ブラウザーからの後続の要求には、Cookie が自動的に含まれます。

フォーム認証の詳細については、「 フォーム認証プロバイダー」を参照してください。

ASP.NET のフォーム認証の詳細については、「 C#.NET を使用して ASP.NET アプリケーションに Forms-Based 認証を実装する方法」を参照してください。

Windows 認証

Windows 認証では、IIS によって認証が実行され、認証されたトークンが ASP.NET ワーカー プロセスに転送されます。 Windows 認証を使用する利点は、コーディングを最小限に抑える必要があるということです。 Windows 認証を使用して、IIS が認証する Windows ユーザー アカウントを偽装してから、ASP.NET に要求を渡します。

Windows 認証の詳細については、「WindowsAuthenticationModule プロバイダー」を参照してください。

パスポート認証

Passport 認証は、Microsoft が提供する一元化された認証サービスであり、メンバー サイトのシングル サインインとコア プロファイル サービスを提供します。 通常、Passport 認証は、複数のドメイン間でシングル サインイン機能が必要な場合に使用されます。

Passport 認証の詳細については、「 Passport Authentication Provider」を参照してください。

既定の認証

既定の認証は、Web アプリケーションでセキュリティが不要な場合に使用されます。このセキュリティ プロバイダーには匿名アクセスが必要です。 すべての認証プロバイダーの中で、既定の認証はアプリケーションのパフォーマンスを最大限に高めます。 この認証プロバイダーは、独自のカスタム セキュリティ モジュールを使用する場合にも使用されます。

Authorization

承認は、認証されたユーザーが要求されたリソースにアクセスできるかどうかを確認するプロセスです。

ASP.NET には、次の承認プロバイダーが用意されています。

ファイルの承認

クラスはFileAuthorizationModuleファイルの承認を実行し、Windows 認証を使用するとアクティブになります。 FileAuthorizationModuleは、Windows Access Control Lists (ACL) に対するチェックを実行して、ユーザーがアクセス権を持つ必要があるかどうかを判断する責任を負います。

URL の承認

クラスは UrlAuthorizationModule 、均一リソース識別子 (URI) 名前空間に基づいて承認を制御する Uniform Resource Locator (URL) 承認を実行します。 URI 名前空間は、NTFS アクセス許可で使用される物理フォルダーとファイル パスとは異なる場合があります。

UrlAuthorizationModuleは、正と負の両方の承認アサーションを実装します。つまり、モジュールを使用して、ユーザー、ロール (マネージャー、テスター、管理者など)、動詞 (や などGETPOST) の 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");

フォーム認証を使用している場合、ロールは認証されたユーザーに割り当てません。これをプログラムで行う必要があります。 認証されたユーザーにロールを割り当てるには、認証モジュール (この例では Forms 認証モジュール) のイベントを使用 OnAuthenticate して新 GenericPrincipal しいオブジェクトを作成し、 の HttpContextUser プロパティに割り当てます。 次のコードは、これを示しています。

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");

ロールベースのセキュリティの詳細については、「 ロールベースのセキュリティ」を参照してください。

関連情報

ASP.NET に関する一般的な情報については、次のニュースグループを参照してください。

ASP.NET ニュースグループ

詳細については、次の記事または書籍を参照してください。