ASP.NET Membership - 本地登录可行,但在Azure上失败

18

我正在开发一个MVC3网站,但在使用ASP.NET Membership时遇到了一个令人困惑的问题。我使用的是连接到SQL Azure数据库的System.Web.Providers 1.0.1。

目前情况是,在计算模拟器下可以成功登录的用户名/密码,在Azure生产环境下却不能登录。我可以看到它正在使用正确的数据库,因为成员身份验证数据库中的 Failed Password Attempts 计数器正在更新。


我不能告诉你具体的问题是什么,但我建议你为你的部署启用Intellitrace。启用Intellitrace后,只需部署云项目,进行一次登录尝试,然后下载Intellitrace日志。你会发现Intellitrace是多么强大和有用,我相信你通过查看异常信息将解决问题。 - astaykov
1
谢谢您的建议,但据我所知,Intellitrace仅支持VS Ultimate版本,而且我不确定是否愿意在我们当前的MSDN订阅费用之外再额外支付12000美元购买某个可能或可能不解决我的问题的东西。 - Kjetil Limkjær
等一下...你是说“在计算机仿真器下”,这意味着你正在使用Web角色或工作角色——而不是Web站点(即IIS),对吗?下面的machinekey更改会更改计算机仿真器的行为吗? - Scott Hanselman
你的评论让我有点困惑,因为我已经有一段时间没有使用Azure了 - 我看到6月份的更新引入了Azure“网站”,而不是2011年发布该问题时唯一的选择“Web角色” :-) 此外,更改机器密钥/哈希算法意味着必须重新生成密码以在计算模拟器下工作,但它们将在测试和外部使用。如果您有一组需要保留的散列密码,我认为您可以克隆现有的机器密钥,但我不知道在哪里找到它。 - Kjetil Limkjær
1个回答

28

通过阅读David Hoerster的这篇文章,我找到了问题所在。问题在于Azure上的默认密码哈希算法与.NET 4.0默认设置不同。Azure上默认设置为SHA1,而HMACSHA256是4.0的新标准设置。

可以通过在web.config中显式指定哈希类型来解决此问题。如果您决定使用像HMACSHA256这样的方法,则确保还指定了机器密钥--否则,由于自动生成的机器密钥会因服务器不同而不同,您将遇到类似的问题。

您需要更改的配置元素位于<system.web>下方的<machinekey>中:

<machineKey decryptionKey="PUT_DECRYPTION_KEY_HERE"
            validationKey="PUT_VALIDATION_KEY_HERE"
            decryption="AES"
            validation="HMACSHA256" />

您可以使用 此机器密钥生成器 以正确格式生成随机密钥。


1
不客气 - 如果不是你,我就不会知道JACSHT :-) - Kjetil Limkjær
1
哈哈哈哈!!!太有趣了。我需要更多地推广这个缩写词。谢谢你让我笑了! - David Hoerster
如果我可以给这个点赞更多次,我一定会的。我以为这是一个哈希问题,因为我看到它在访问数据库而没有进行验证。为什么会发生这种情况还是个谜。奇怪的是,通过 Azure 发布登录失败了,但通过 Web Deploy 发布却成功了。我猜测 Web Deploy 在机器密钥方面可能做了一些不同的事情。感谢您! - GraemeMiller
您是否需要在Membership标签中指定hashAlgorithmType="SHA256"?还是应该使用hashAlgorithmType="HMACSHA256"? - NER1808
我不知何时找到了这个答案,收藏了它,然后忘记了它,又花了半个小时寻找解决方案,最后又找到了你的解决方案。谢谢! - xkingpin
NER1808,请查看http://msdn.microsoft.com/en-us/library/system.web.security.membership.hashalgorithmtype.aspx。它说:“如果未设置HashAlgorithmType属性,则Membership类将使用在machineKey元素的验证属性中设置的哈希算法。” - Concrete Gannet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接