3

我在生产中有一个现有的应用程序,它使用 SqlMembershipProvider 并具有指定的机器密钥:

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

它目前在 .Net 2.0 AppPool 下运行。

我正在编写一个必须使用现有数据库的新应用程序,我有该数据库的备份。我正在尝试让 SqlMembershipProvider 使用它(它确实如此),但我无法让已知的用户名/密码正常工作。此帐户在 prod 中工作,并且两个数据库(prod 和 mine)上的密码 hash 和 salt 相同。但是,在 SqlMembershipProvider 将数据库中的密码与输入的散列密码进行比较时,它们并不相同。

本文建议在 .Net 4.0 中使用 ASP.Net 中的默认散列算法进行重大更改: http ://www.asp.net/learn/whitepapers/aspnet4/break-changes

但是,我已经按照建议指定了机器密钥。此外,我剥离了 .Net 4.0 组件并将其放回 3.5(即 CLR 2),输入密码的哈希值仍然相同。

此外,我尝试将这个新的临时应用程序重新部署到同一服务器生产上,但它仍然无法登录(尽管我无法验证它是否由于密码哈希不匹配而失败)。

我还能在这里尝试什么?

4

2 回答 2

2

您需要在 web.config 中指定成员资格提供程序的 hashAlgorithmType,因为默认值已随 .net 4 更改。

您想要的值很可能是 SHA1。

详情请查看以下页面:http: //geekswithblogs.net/DavidHoerster/archive/2010/06/15/asp.net-membership-password-hash----.net-3.5-to-.net- 4.aspx

于 2011-02-01T19:33:30.773 回答
0

首先将生产应用程序复制到 dev/test 并在那里运行它以查看它是否按预期工作。如果确实如此,请继续升级项目以在 .NET 4.0 下运行,但不要修改任何其他代码(即不要尝试使其与 SQLMembershipProvider 一起使用) - 重新测试应用程序 如果可行,您知道它不是环境问题,这不是 .NET 重大更改问题,这将表明您的代码中的某些内容无法按您预期的那样工作。我的猜测是您在新应用程序中使用的散列算法与旧应用程序中使用的不同。您是否在旧应用程序中添加了密码?您是否在新应用程序中使用相同的盐?

于 2011-02-01T19:29:39.117 回答