自动生成的密钥不支持散列或加密密码

时间:2009-02-13 17:28:36

标签: asp.net-membership

我创建了一个会员提供程序,并将我的web.config更改为

<membership defaultProvider="MyMembershipProvider">
   <providers>
     <clear/>
     <add name="MyMembershipProvider"
          type="Khafan.Providers.SqlMembershipProvider"
          connectionStringName="KhafanConnectionString"  
          maxInvalidPasswordAttempts="5"             
          passwordAttemptWindow="10"
          minRequiredNonalphanumericCharacters="0"
          minRequiredPasswordLength="4"
          passwordStrengthRegularExpression=""
          passwordFormat="Hashed"
          enablePasswordReset="true"
          enablePasswordRetrieval="false"             
          requiresQuestionAndAnswer="false"
          requiresUniqueEmail="true" />
   </providers>
 </membership>

但是现在,每当我尝试浏览到ASP.Net Configuration的安全页面时,它都会给我以下错误:

自动生成密钥不支持散列或加密密码

在我的数据库中,我使用了Identity for PKs。我不知道这是不是问题。但如果是的话,我该如何解决呢?我不想改变身份值。

感谢。

2 个答案:

答案 0 :(得分:20)

这是因为您正在哈希密码但未在web.config中设置特定密钥。这个MSDN article中有一个“密钥生成器”代码段,运行两次并将它们推送到您的web.config中:

<system.web>
    <machineKey  
    validationKey="<blah>"           
    decryptionKey="<blah>"
    validation="SHA1"
    decryption="AES"
    />

这应该可以解决你的问题。就像这样,因为否则您可以将您的会员数据库/应用程序带到另一台机器上,并且您的密码都不会起作用,因为自动生成的机器密钥会有所不同: - )

答案 1 :(得分:4)

去寻找“关键发电机”片段是有点儿的事情 MSDN link史蒂文罗宾斯在他的回答中提到,所以我在这里添加它以便快速参考。所以这不是一个独立的答案。这是对已接受答案的补充。

来自MSDN

  

以下代码显示了如何操作   生成随机密钥值。编   用于创建控制台的代码   申请,然后通过   所需的密钥大小作为命令行   论证表达为理想   十六进制字符数。每   byte由两个十六进制表示   字符;因此,要求一个   32字节密钥,作为命令行传递64   论点。如果你没有指定   参数,代码返回128   十六进制字符(64字节)键。

using System;
using System.Text;
using System.Security;
using System.Security.Cryptography;

class App {
  static void Main(string[] argv) {
    int len = 128;
    if (argv.Length > 0)
      len = int.Parse(argv[0]);
    byte[] buff = new byte[len/2];
    RNGCryptoServiceProvider rng = new 
                            RNGCryptoServiceProvider();
    rng.GetBytes(buff);
    StringBuilder sb = new StringBuilder(len);
    for (int i=0; i<buff.Length; i++)
      sb.Append(string.Format("{0:X2}", buff[i]));
    Console.WriteLine(sb);
  }
}

此外,<machineKey>位于<system.web>内,如下所示:

<system.web>
    <machineKey
        validationKey=""
        decryptionKey=""
        validation="SHA1"
        decryption="AES"
/>