如何使用 Visual C# .NET 创建用于窗体身份验证的密钥

有关本文的 Microsoft Visual Basic .NET 版本,请参阅 313091.

本文引用下面的 Microsoft .NET Framework 类库命名空间:
  • System.Text
  • System.Security.Cryptography

本任务的内容

概要
本文描述如何创建用于窗体身份验证 cookie 数据的加密、解密和验证的密钥。您可以将本文中创建的密钥用于 Machine.config 文件中的 <system.web> 元素中的 <machineKey> 节的 validationKeydecryptionKey 属性。


要求

下面的列表概述了推荐使用的硬件、软件、网络基础结构以及所需的 Service Pack:
  • Microsoft Windows 2000 或 Microsoft Windows XP
  • Microsoft .NET Framework
  • Microsoft Internet 信息服务 (IIS)

返回页首

创建项目

创建 Visual C# .NET 控制台应用程序:
  1. 启动 Visual Studio .NET。
  2. 文件菜单上,指向新建,然后单击项目
  3. 项目类型下,单击 Visual C# 项目
  4. 模板下,单击“控制台应用程序”。
  5. 将该项目命名为 HashConfigCs
  6. 单击确定

编写用于生成密钥的代码

下面的代码将读取从命令行传入的两个参数:
  • 第一个参数是用于创建 decryptionKey 属性的字节数。
  • 第二个参数是用于创建 validationKey 属性的字节数。
代码使用随机数生成器创建基于命令行参数的随机字节数。在创建随机字节后,这些字节将格式化为适合在 .config 文件中使用的十六进制字符串。

注意:所创建的十六进制字符串的大小是从命令行传入值的大小的两倍。例如,如果您为密钥指定 24 字节,则转换后相应的字符串长度为 48 字节。decryptionKey 的有效值为 8 或 24。此属性将为数据加密标准 (DES) 创建一个 16 字节密钥,或者为三重 DES 创建一个 48 字节密钥。validationKey 的有效值为 20 到 64。此属性将创建长度从 40 到 128 字节的密钥。代码的输出是一个完整的 <machineKey> 元素,您可以将其复制并粘贴到 Machine.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();        }    }}				

生成哈希

现在可编译应用程序。

从命令提示符下运行该应用程序,方法是通过传入两个整数值,它们的大小分别为加密密钥和验证密钥的大小。例如,如果您将控制台应用程序命名为 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. 重新启动 Web 场中所有服务器上的 IIS,以使 Machine.config 的更改生效。

疑难解答

在下列情况下,确保 <machineKey> 节在 Web 场中具有相同的显式密钥(即不要为 <machineKey> 节中的属性使用 AutoGenerate 选项):
  • 在您使用窗体身份验证时。
  • 在您以 StateServer 模式运行会话状态时。
  • 在您希望 ViewState 在 Web 场中可用时(因为默认情况下 enableViewStateMAC 属性设置为 True)。

更多信息

在下列情况下,machineKey 节在整个 Web 场中应是相同的:
  • 在使用窗体身份验证时。
  • 在您以 StateServer 模式运行会话状态时。
  • 在您希望 viewstate 在整个 Web 场中可用时(因为默认情况下 enableViewStateMac 为打开状态)。
参考
有关其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
301240如何使用 C# .NET 在 ASP.NET 应用程序中实现基于窗体的身份验证
311495 如何使用 Visual C# .NET 在 ASP.NET 应用程序中通过基于窗体的身份验证实现基于角色的安全性
306590 INFO:ASP.NET 安全性概述
307626 INFO:ASP.NET 配置概述
view state
属性

文章 ID:312906 - 上次审阅时间:09/05/2005 09:11:00 - 修订版本: 3.9

Microsoft ASP.NET 1.0, Microsoft Visual C# .NET 2002 标准版, Microsoft ASP.NET 1.1, Microsoft Visual C# .NET 2003 标准版

  • kbconfig kbhowtomaster kbsecurity kbstate KB312906
反馈