在 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 中工作?

使用 MVC4 asp.net 随机注销

ASP.NET MVC4 部分视图

ASP.NET MVC4 部分视图

转:Asp.net Mvc4默认权限详细(上)