从ASP.NET Membership迁移到MVC4 RTM中的SimpleMembership

27
新的MVC4 RTM互联网应用程序模板使用SimpleMembership提供程序,如此处所述:SimpleMembership 我的现有MVC网站使用ASP.Membership框架,理想情况下,我希望将这些表中的用户数据迁移到新的SimpleMembership表中。我之所以要这样做的原因是:
  1. 更清晰地与使用EF的其余数据库集成
  2. 支持Azure和OAuth等功能
  3. 使用最新的MVC4 RTM Controllers/Views而无需进行修改
  4. 我一直认为现有的成员实现对我需要的内容过于臃肿
因此,今天我编写了一个SQL脚本来将现有的ASP.Net Membership表中的数据迁移到新的Simple Membership表中。此处可找到: here
在我的MVC 4网站中测试登录时,密码验证失败。我相信SimpleMembership使用与旧的Membership框架不同的密码算法,因为在SimpleMemberShip框架下创建的新密码看起来要长得多。
那么我的问题是,既然我在旧的ASP.Net成员提供程序中使用了"hashed"密码格式,而用户的原始密码不可检索,我有哪些选项可以使SimpleMembership提供程序正常工作?
我猜测一些选项是:
  1. 让我的用户重置密码
  2. 使SimpleMembership提供程序使用与旧的ASP.Net Membership提供程序相同的密码算法。
  3. 将新的MVC 4 RTM互联网应用程序模板恢复为使用旧的ASP.Net MemberShip提供程序。这对我来说是最不希望的选择,因为我想使用SimpleMemberShip框架。
我认为许多人也正在尝试将其现有的成员数据库迁移到新的SimpleMemberShip提供程序。
非常感谢您的任何帮助。
Cheers
Jim

2
这是一篇关于迁移的文章,可以透明地处理哈希差异。http://pretzelsteelersfan.blogspot.com/2012/11/migrating-legacy-apps-to-new.html - PretzelSteelersFan
谢谢Paul,这是我见过的最好的解决方案。我打算采用这个方案。 - Jim Culverwell
3个回答

12

我应该指出,这仅适用于密码已经被哈希的情况。如果它们是加密的,你必须自己解密密码,然后使用Paul的技术保存它。我必须为我的网站做这个,所以当我弄清楚代码时,我会在Paul的帖子上留言。 - Robert McLaws
好的,你可以在这里找到我的代码来处理加密密码和哈希密码:https://gist.github.com/advancedrei/5558238。你需要将我的DecryptingSqlMembershipProvider添加到提供程序列表中,以及SimpleMembershipProvider一起使用,才能使其正常工作。 - Robert McLaws

11

当用户登录时,您可以访问明文密码,这给了您另一种选择:

  1. 将旧密码保存在单独的表中
  2. 在登录时,首先使用SimpleMembership方法
  3. 如果失败,请使用旧的哈希算法检查旧密码表(您需要确保明文密码仍在上下文中)
  4. 如果成功,请更新SimpleMembership表,并从旧密码表中删除

用户不需要知道更改的内容,而活跃用户将具有更安全的哈希值。 如果您想在未来强制进行安全升级,则可以警告用户,在一年的不活动后删除其帐户,然后只使用单个步骤系统。


我喜欢这个想法,但是我很难弄清楚它的实现方式。你能否提供更多关于如何在会员资格上下文之间切换的解释? - Vinney Kelly
@vinney,你不需要使用两个成员资格上下文,只需手动访问旧表中的原始数据即可。虽然使用两个上下文可能是可能的,但如果我最终采用这种方法,我将直接访问旧表。 - Simon_Weaver

7

我遇到过类似的问题,我本应该写一篇关于如何解决这个问题的教程/博客文章,但我的解决方案是将以下内容添加到我的web.config文件中(这对应选项#2):

<system.web>

    <membership hashAlgorithmType="SHA1" defaultProvider="DefaultMembershipProvider">
      <providers>
        <add name="DefaultMembershipProvider" etc.../>
      </providers>
    </membership>
    <machineKey validation="SHA1" />
    ...
</system.web>

上述代码的有趣部分是“hashAlgorithmType”。将其设置为SHA1将使用旧的asp.net成员资格哈希算法。
我也处于类似的位置 - 我要么要求我的用户更新他们的密码,要么继续使用特定的哈希算法。
希望这可以帮助你! -Sig

谢谢Sig,非常感谢,我相信其他人会发现这非常有用。最终,我将让用户使用新的SimpleMemberShip哈希算法重置密码。显然,这比旧的SHA1算法更安全。 - Jim Culverwell
您好,Sig。我尝试了您的解决方案,但它在我的项目中不起作用。<membership hashAlgorithmType="SHA1" defaultProvider="simple"> <providers> <clear/> <add name="simple" type="WebMatrix.WebData.SimpleMembershipProvider, WebMatrix.WebData"/> </providers> </membership> <machineKey validation="SHA1" /> 这样正确吗?谢谢! - Chance
嘿Chance,我觉得那一切看起来都还好。你有遇到特定的错误或问题吗? - Sig Myers

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