11

我创建了一个会员提供程序并将我的 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 配置的安全页面时,都会出现以下错误:

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

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

谢谢。

4

2 回答 2

21

这是因为您正在对密码进行哈希处理,但尚未在 web.config 中设置特定密钥。这篇MSDN 文章中有一个“密钥生成器”片段,运行它两次并将它们推到你的 web.config 中:

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

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

于 2009-02-13T17:36:34.407 回答
4

在MSDN 链接Steven Robbins 在他的回答中提到的“密钥生成器”片段中寻找“密钥生成器”片段有点笨拙 ,所以我在这里添加它以供快速参考。所以这不是一个独立的答案。它是对已接受答案的补充。

来自 MSDN

以下代码显示了如何生成随机键值。编译代码以创建控制台应用程序,然后将所需的密钥大小作为命令行参数传递,以所需的十六进制字符数表示。每个字节由两个十六进制字符表示;因此,要请求 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"
/>
于 2010-07-12T11:01:45.937 回答