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

文章翻译 文章翻译
文章编号: 312906 - 查看本文应用于的产品
展开全部 | 关闭全部

本文内容

概要

本文描述如何创建用于窗体身份验证 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 配置概述

属性

文章编号: 312906 - 最后修改: 2005年9月5日 - 修订: 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
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