在 MVC4 RTM 中从 ASP.NET 成员身份迁移到 SimpleMembership
Posted
技术标签:
【中文标题】在 MVC4 RTM 中从 ASP.NET 成员身份迁移到 SimpleMembership【英文标题】:Migrating from ASP.NET Membership to SimpleMembership in MVC4 RTM 【发布时间】:2012-08-27 12:32:06 【问题描述】:新的 MVC4 RTM 互联网应用程序模板使用 SimpleMembership 提供程序,如下所述SimpleMembership
我现有的 MVC 网站使用 ASP.Membership 框架,理想情况下,我希望将这些表中的用户数据迁移到新的 SimpleMembership 表中。我想这样做的原因是:
-
与我使用 EF 的数据库的其余部分更清晰地集成
开箱即用支持 Azure 和 OAuth
无需修改即可使用最新的 MVC4 RTM 控制器/视图
我一直觉得现有的成员资格实施对于我需要的东西来说有点臃肿
所以我今天编写了一个 SQL 脚本,将现有 ASP.Net Membership 表中的数据迁移到新的 Simple Membership 表中。这个可以找到here
在我的 MVC 4 网站中测试登录,密码验证失败。我相信 SimpleMembership 使用的密码算法与旧的 Membership 框架不同,因为在 SimpleMemberShip 框架下创建的新密码看起来要长得多。
所以我的问题是,由于我在旧的 ASP.Net 会员提供程序中使用“散列”密码格式并且用户的原始密码无法恢复,我必须有哪些选项才能让 SimpleMembership 提供程序正常工作。
我猜一些选项是:
-
让我的用户重置他们的密码
让 SimpleMembership 提供程序使用与旧 ASP.Net Membership 提供程序相同的密码算法。
恢复新的 MVC 4 RTM Internet 应用程序模板以使用旧的 ASP.Net MemberShip 提供程序。这对我来说是最不理想的选择,因为我想使用 SimpleMemberShip 框架。
我怀疑很多人也在寻求将他们现有的会员数据库迁移到新的 SimpleMemberShip 提供商。
非常感谢任何帮助。
干杯
吉姆
【问题讨论】:
这是一篇关于迁移的帖子,它透明地处理散列的差异。 pretzelsteelersfan.blogspot.com/2012/11/… 感谢 Paul,这是迄今为止我见过的最好的解决方案。我要采纳这个。 【参考方案1】:我想公开 Paul 的评论,以防有人错过,并建议他的解决方案是我见过的最好的。
http://pretzelsteelersfan.blogspot.com/2012/11/migrating-legacy-apps-to-new.html
谢谢保罗
【讨论】:
我应该指出,这仅在您的密码经过哈希处理时才有效。如果它们是加密的,您必须自己解密密码,然后使用 Paul 的技术保存它。我必须为我的网站这样做,所以当我弄清楚代码时,我会在 Paul 的帖子上发表评论。 好的,除了散列密码here,你可以找到我处理加密密码的代码。您必须将我的 DecryptingSqlMembershipProvider 与 SimpleMembershipProvider 一起添加到 Providers 列表中才能正常工作。【参考方案2】:当用户登录时,您可以访问纯文本密码,这为您提供了另一种选择:
-
将旧密码保存在单独的表格中
登录时,首先使用 SimpleMembership 方法
如果失败,请使用旧哈希算法检查旧密码表(您需要确保纯文本密码仍在上下文中)
如果成功,请更新 SimpleMembership 表,并从旧密码表中删除
用户不需要知道更改,并且活动用户将拥有更安全的哈希值。如果您以后想强制进行安全升级,您可以警告用户他们的帐户将在一年不活动后被删除,然后退出两步系统。
【讨论】:
我喜欢这个想法,但我很难弄清楚实现。您能否提供更多关于如何在成员资格上下文之间切换的解释? @vinney 您不会使用两个成员上下文 - 只需手动访问旧表中的原始数据。使用两个上下文可能是可能的,但如果我最终使用这种方法,我将直接访问旧表【参考方案3】:我有一个类似的问题,我应该写一篇关于这样做的教程/博客文章,但我的解决方案是将以下内容添加到我的 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,非常感谢,我相信其他人会发现这非常有用。最后,我将让用户使用新的 SimpleMemberShip 散列来重置他们的密码。显然这比旧的 SHA1 算法更安全。 嗨,西格。我尝试了您的解决方案,但它在我的项目中不起作用。以上是关于在 MVC4 RTM 中从 ASP.NET 成员身份迁移到 SimpleMembership的主要内容,如果未能解决你的问题,请参考以下文章
Orchard 发布1.0版本和ASP.NET MVC 3 RTM
为啥 [Authorize(Roles = "Admin")] 不能在具有 ASP.NET 标识的 MVC 5 RTM 中工作?