2

我正在尝试将在 .Net 4 中创建的会员数据库移动到新创建的 .Net 4.5 会员数据库。.Net 4.5 数据库与旧的 .Net 4 数据库具有不同的架构。所以我创建了一个新的 4.5 会员数据库并尝试重新创建用户。

我正在从旧数据库中选择我的用户,然后使用 Membership.CreateUser() 在新的会员数据库中重新创建这些用户。因为我还需要他们的密码,所以我使用 SQL UPDATE 语句将 Membership 表中的 Password 和 PasswordSalt 字段设置为与旧数据库中相同的值。

任何新用户都可以毫无问题地登录,但如上所述,复制的用户无法登录(“您的登录尝试不成功。请重试。”)

我可以看到“FailedPasswordAttemptCount”随着您尝试登录而增加..所以它正在寻找用户..问题必须与密码或密码的解密有关。

我做错了什么,试图复制密码?两个数据库都在同一台机器上......当然密码和密码盐应该足以解密它?

4

1 回答 1

1

首先,您的密码不会被解密,用户提交的密码是经过哈希处理的,并且与存储在数据库中的哈希值进行比较。哈希通常在机器密钥上起作用,尽管这可以在Web.Config不同版本的 IIS 中进行更改。

您可以尝试制作原始数据库的副本,然后对其运行 .net 4.5 ASPNET_REGSQL 以查看它是否会正确更新它,我怀疑它会,但值得一试。

我要做的第一件事是在您的Web.Config文件中查看该Providers部分并验证它与旧项目版本的相同。这决定了密码格式,如果你幸运的话,这将是问题,但我怀疑它是。

您还可以(取决于数据库中有多少用户)能够通过某些程序或网站解密他们的密码。是过时的,但可能会有所帮助。如果可以检索他们的纯文本密码,您可以像这样重新创建用户。

我找不到任何说明散列过程从 4.0 版更改为 4.5 版的内容,但如果确实如此,您可能需要定义自定义散列算法。基本上,您需要像 .net 4.0 那样重新创建散列。

如果第一次验证失败,您还可以尝试对密码进行第二次手动验证。像这样的东西。

PasswordFormat 值在 ASP.NET 应用程序的 Web.config 文件的提供程序部分中指定。

默认情况下,加密和散列密码根据您配置中 machineKey 元素中提供的信息进行加密或散列。请注意,如果您为验证属性指定值 3DES,或者如果未指定值,则散列密码将使用 SHA1 算法进行散列。

可以使用成员资格配置元素的 hashAlgorithmType 属性定义自定义哈希算法。如果您选择加密,则默认密码加密使用 AES。您可以通过设置 machineKey 配置元素的解密属性来更改加密算法。如果要加密密码,则必须为 machineKey 元素中的 decryptionKey 属性提供显式值。使用具有 ASP.NET 成员身份的加密密码时,不支持 decryptionKey 属性的默认值 AutoGenerate。

于 2012-08-23T07:50:42.980 回答