如何使用 Visual C#.NET 以用於表單驗證建立機碼

文章翻譯 文章翻譯
文章編號: 312906 - 檢視此文章適用的產品。
全部展開 | 全部摺疊

在此頁中

結論

本文將告訴您,如何建立用來加密、 解密及驗證表單驗證 Cookie 資料的索引鍵。您可以使用您在 validationKeydecryptionKey 屬性 <machinekey>區段中的這篇文章中建立的按鍵,<system.web> Machine.config 檔中的項目。


需求

下列清單列出建議的硬體、 軟體、 網路基礎結構及您需要的服務套件:
  • Microsoft Windows 2000 或 Microsoft Windows XP
  • Microsoft.NET 架構
  • Microsoft 網際網路資訊服務 (IIS)

建立專案

建立 Visual C#.NET 主控台應用程式:
  1. 啟動 Visual Studio.NET。
  2. 檔案] 功能表上指向 [新增],然後按一下 [專案]。
  3. 在 [專案類型 下, 按一下 [Visual C# 專案]。
  4. 在 [範本,] 下按一下 [主控台應用程式]。
  5. 為專案的名稱 HashConfigCs
  6. 按一下 [確定]

撰寫程式碼來產生金鑰

下列程式碼會讀取兩個命令列從傳遞的引數:
  • 第一個引數是用來建立 decryptionKey 屬性的位元組數目。
  • 第二個引數是用來建立 validationKey 屬性的位元組數目。
程式碼會使用隨機亂數產生器來建立一個隨機根據命令列引數的位元組數。建立隨機位元組之後位元組會格式化成適合使用.config 檔案中的十六進位字串。

附註已建立的十六進位字串是兩次傳遞命令列之值的大小。比方說如果您指定 24 個位元組的索引鍵,產生的字串是 48 位元組的長度後轉換。有效的 decryptionKey 值是 8 或 24。這會建立 16 位元機碼的資料加密標準 (DES) 或 48 位元組鍵的三重 DES 分別。validationKey 的有效值是 20 到 64。這會從 40 的機碼建立至 128 位元組的長度時。 從程式碼輸出是整個 <machinekey> 項目,您可以複製並貼入 Machine.config 檔。

Add the following code to a .cs file:
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();
        }
    }
}
				

產生之雜湊

現在您可以編譯應用程式。

從命令提示字元執行應用程式,透過傳入會解密和驗證金鑰的大小的兩個整數值。比方說如果具名主控台應用程式 HashConfigCs.exe,輸入 [Bin\debug 目錄的應用程式中的 [從命令列下列語法]:
hashconfigcs.exe 24 64
您可以預期這個應用程式會傳回類似下列的輸出的輸出:
<machineKey validationKey="21F090935F6E49C2C797F69BBAAD8402ABD2EE0B667A8B44EA7DD4374267A75D7AD972A119482D15A4127461DB1DC347C1A63AE5F1CCFAACFF1B72A7F0A281B"
            decryptionKey="261F793EB53B761503AC445E0CA28DA44AA9B3CF06263B77"
            validation="SHA1"/>
					
附註因為程式碼會使用隨機亂數產生器,輸出是不同每一次。


更新組態檔

  1. 找出 Machine.config 檔案。
  2. 找不到 <system.web> 組態檔中的區段。
  3. 從主控台應用程式輸出取代 <machinekey>區段。如果 <machinekey>區段不存在,建立它。
  4. 儲存組態檔。
  5. 在 Machine.config 變更才會影響 Web 伺服陣列中的所有伺服器上,重新啟動 IIS。

疑難排解

請確定 <machinekey>區段具有完全相同、 明確的機碼 (也就是不要使用自動產生 選項 <machinekey>區段中的屬性) 跨 Web 伺服陣列,在下列情況中:
  • 當您使用表單驗證。
  • 當您在 StateServer 模式中執行工作階段狀態。
  • 當您想 ViewState 能夠跨 Web 伺服陣列使用,因為 enableViewStateMAC 屬性依預設,設定為 True

詳細資訊

machineKey 區段應該是一樣的跨 Web 伺服陣列,在下列情況中:
  • 當使用表單驗證。
  • 當您在 StateServer 模式中執行工作階段狀態。
  • 當您要 ViewState 是可用跨 Web 伺服陣列,因為預設開啟 enableViewStateMac。

?考

如需詳細資訊按一下 [下列面的文件編號,檢視 「 Microsoft 知識庫 」 中發行項]:
301240如何使用 C#.NET,ASP.NET 應用程式中實作表單型驗證
311495如何使用 Visual C#.NET,ASP.NET 應用程式中實作角色架構安全性與表單基礎的驗證
306590資訊: ASP.NET 安全性概觀
307626資訊: ASP.NET 組態概觀

屬性

文章編號: 312906 - 上次校閱: 2005年7月11日 - 版次: 3.10
這篇文章中的資訊適用於:
  • Microsoft ASP.NET 1.0
  • Microsoft Visual C# .NET 2002 Standard Edition
  • Microsoft ASP.NET 1.1
  • Microsoft Visual C# .NET 2003 標準版
關鍵字:?
kbmt kbconfig kbhowtomaster kbsecurity kbstate KB312906 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:312906
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。

提供意見

 

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