我创建了一个会员提供程序,并将我的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。我不知道这是不是问题。但如果是的话,我该如何解决呢?我不想改变身份值。
感谢。
答案 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"
/>