Visual C# .NET を使用して、フォーム認証に使用するキーを作成する方法

文書翻訳 文書翻訳
文書番号: 312906 - 対象製品
この記事は、以前は次の ID で公開されていました: JP312906
Microsoft Visual Basic .NET については、次の資料を参照してください。 313091

この資料では、次の Microsoft .NET Framework クラス ライブラリの名前空間を参照しています。
  • System.Text
  • System.Security.Cryptography
すべて展開する | すべて折りたたむ

目次

概要

この資料では、フォーム認証の Cookie データの暗号化、解読、および検証に使用するキーの作成方法について説明します。この資料で作成するキーは、Machine.config ファイルおよび Web.config ファイルで <system.web> 要素の <machineKey> セクションの validationKey 属性および decryptionKey 属性に使用できます。

必要条件

次の一覧は、推奨する必要なハードウェア、ソフトウェア、ネットワーク インフラストラクチャ、および Service Pack です。
  • Microsoft Windows 2000 または Microsoft Windows XP
  • Microsoft .NET Framework
  • Microsoft インターネット インフォメーション サービス (IIS)

プロジェクトの作成

以下の手順を実行して、Visual C# .NET のコンソール アプリケーションを作成します。
  1. Visual Studio .NET を起動します。
  2. [ファイル] メニューの [新規作成] をポイントし、[プロジェクト] をクリックします。
  3. [プロジェクトの種類] で [Visual C# プロジェクト] をクリックします。
  4. [テンプレート] の [コンソール アプリケーション] をクリックします。
  5. プロジェクトに HashConfigCs という名前を付けます。
  6. [OK] をクリックします。

キーを生成するコードの記述

以下のコードにより、コマンド ラインから渡される 2 つの引数が読み取られます。
  • 最初の引数は、decryptionKey 属性の作成に使用されるバイト数です。
  • 2 番目の引数は、validationKey 属性の作成に使用されるバイト数です。
コードでは乱数ジェネレータを使用して、コマンド ライン引数に基づいた任意のバイト数が作成されます。作成された任意のバイト数は、.config ファイルで使用するのに適した 16 進数の文字列に変換されます。

: 作成される 16 進数の文字列のサイズは、コマンド ラインで渡される値の 2 倍になります。たとえば、キーに 24 バイトを指定すると、変換後の文字列の長さは 48 バイトになります。decryptionKey の有効な値は 8 または 24 です。これにより、DES (Data Encryption Standard) 用の 16 バイト キー、または Triple DES 用の 48 バイト キーがそれぞれ作成されます。validationKey の有効な値は 20 〜 64 です。これにより、長さ 40 〜 128 バイトのキーが作成されます。コードからは、<machineKey> 要素全体が出力されます。この出力を Machine.config ファイルまたは Web.config ファイルにコピーして貼り付けることができます。

.cs ファイルに以下のコードを追加します。
using System;
using System.Text;
using System.Security.Cryptography;
namespace Crypto
{
    public class KeyCreator
    {
        public static void Main(String[] args)
        {			
            String[] commandLineArgs = System.Environment.GetCommandLineArgs();
            string decryptionKey = CreateKey(System.Convert.ToInt32(commandLineArgs[1]));
            string validationKey = CreateKey(System.Convert.ToInt32(commandLineArgs[2]));
            Console.WriteLine("<machineKey validationKey=\"{0}\" decryptionKey=\"{1}\" validation=\"SHA1\"/>", validationKey, decryptionKey);
        }	
        static String CreateKey(int numBytes) 
        {
            RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
            byte[] buff = new byte[numBytes];
            rng.GetBytes(buff);
            return BytesToHexString(buff);
        }
        static String BytesToHexString(byte[] bytes) 
        {
            StringBuilder hexString = new StringBuilder(64);
            for (int counter = 0; counter < bytes.Length; counter++) 
            {
                hexString.Append(String.Format("{0:X2}", bytes[counter]));
            }
            return hexString.ToString();
        }
    }
}
				

ハッシュの生成

これまでの作業により、アプリケーションはコンパイルできる状態になっています。

コマンド プロンプトから、解読キーと検証キーのサイズを示す 2 つの整数値を渡して、アプリケーションを実行します。たとえば、コンソール アプリケーションに HashConfigCs.exe という名前を付けた場合、アプリケーションの Bin\debug ディレクトリでコマンド ラインから以下の構文を入力します。
hashconfigcs.exe 24 64
アプリケーションにより、以下のような出力が返されます。
<machineKey validationKey="21F090935F6E49C2C797F69BBAAD8402ABD2EE0B667A8B44EA7DD4374267A75D7AD972A119482D15A4127461DB1DC347C1A63AE5F1CCFAACFF1B72A7F0A281B"
            decryptionKey="261F793EB53B761503AC445E0CA28DA44AA9B3CF06263B77"
            validation="SHA1"/>
					
: コードで乱数ジェネレータが使用されているので、出力は毎回異なります。

構成ファイルの更新

  1. Machine.config ファイルまたは Web.config ファイルに移動します。
  2. 構成ファイルの <system.web> セクションに移動します。
  3. <machineKey> セクションをコンソール アプリケーションからの出力で置き換えます。<machineKey> セクションが存在しない場合は、作成します。
  4. 構成ファイルを保存します。
  5. Machine.config の変更を適用するには、Web ファームのすべてのサーバーで、IIS を再起動します。

トラブルシューティング

以下の場合には、Web ファーム全体で <machineKey> セクションに、同一の明示的なキーがある (つまり、<machineKey> セクションの属性に AutoGenerate オプションを使用していない) ことを確認してください。
  • フォーム認証を使用する場合
  • StateServer モードでセッションの状態を実行する場合
  • enableViewStateMac 属性がデフォルトで True に設定されているので、ViewState を Web ファーム全体で使用可能にする場合

詳細

以下の場合は、Web ファーム全体で machineKey セクションを同じにする必要があります。
  • フォーム認証を使用する場合
  • StateServer モードでセッションの状態を実行する場合
  • enableViewStateMac 属性がデフォルトで True に設定されているので、ViewState を Web ファーム全体で使用可能にする場合

関連情報

関連情報を参照するには、以下の「サポート技術情報」 (Microsoft Knowledge Base) をクリックしてください。
301240 [HOW TO] C# .NET を使用して ASP.NET にフォーム ベースの認証を実装する方法
311495 C# .NET を使用して、ASP.NET アプリケーションにフォーム ベースの認証とロール ベースのセキュリティを実装する方法
306590 ASP.NET のセキュリティについて
307626 ASP.NET の構成の概要

プロパティ

文書番号: 312906 - 最終更新日: 2005年10月13日 - リビジョン: 3.7
この資料は以下の製品について記述したものです。
  • Microsoft ASP.NET 1.0
  • Microsoft Visual C# .NET 2002 Standard Edition
  • Microsoft ASP.NET 1.1
  • Microsoft Visual C# .NET 2003 Standard Edition
キーワード:?
kbconfig kbhowtomaster kbsecurity kbstate KB312906
"Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。"

フィードバック

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com