Asp.net 尽管有MSDN解决方案,哈希在.NET4.0中不再有效

Asp.net 尽管有MSDN解决方案,哈希在.NET4.0中不再有效,asp.net,hash,sqlmembershipprovider,sha,machinekey,Asp.net,Hash,Sqlmembershipprovider,Sha,Machinekey,我在生产中有一个使用SqlMembershipProvider并具有指定机器密钥的现有应用程序: <machineKey validationKey="..." decryptionKey="..." validation="SHA1" decryption="AES"/> 它当前在.Net 2.0 AppPool下运行 我正在编写一个新的应用程序,它必须使用现有的数据库,我有一个备份。我试图让SqlMembershipProvider使用它(确实如此

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

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

它当前在.Net 2.0 AppPool下运行

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

本文建议在.Net 4.0中使用ASP.Net中的默认哈希算法打破更改:

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

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


我还能在这里尝试什么

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

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

您想要的值很可能是SHA1

有关详细信息,请参见下页: