【问题标题】:What's the deal with custom ASP.NET MembershipProviders?与自定义 ASP.NET MembershipProviders 有什么关系?
【发布时间】:2012-05-25 22:38:21
【问题描述】:

我希望有人可以帮助我了解当我尝试实现自定义 MembershipProvider 时发生了什么。这可能更像是一个理论问题而不是代码问题......这就是我所拥有的:

  • MVC 2 应用(从一个空的 MVC 2 项目开始)
  • 带有我自己的“用户”表的 SQL Server 数据库
  • 一个用户类,UserRepository,UserService,等等等等

目前,我的应用程序通过 UserRepository 进行身份验证,如果成功则返回一个 User 对象。然后这个用户对象被存储在会话中,随后被所有需要身份验证的控制器操作询问。

现在...我知道将其存储在会话中会使我容易受到会话劫持,并且更安全的方法是实现我自己的 MembershipProvider。我不明白的是,这个自定义 Provider 最终会在哪里存储我的 User 对象?我看到被覆盖的 ValidateUser() 方法只返回一个布尔值,但我无法弄清楚该用户在网站上的时间该信息在何处保留。

我真的很想保留我现有的流程,同时通过消除对用户身份验证会话的依赖来使其更加安全。一旦用户登录,我喜欢在整个应用程序中拥有一个完整的用户对象,但我愿意接受其他建议。似乎很多 MembershipProvider 文档有点像黑匣子。我希望有人可以解释它实际上在做什么来坚持用户身份验证。

提前致谢

【问题讨论】:

    标签: c# asp.net asp.net-mvc membership-provider


    【解决方案1】:

    一旦用户通过验证,ASP.Net Membership 就会创建一个令牌(一个大的加密字符串),该令牌存储为 cookie 或 URL 字符串的一部分,具体取决于您在配置中的配置方式。它可以根据 cookie 是否可用来选择执行。令牌用于保持用户的身份,以回答您关于它如何在低级别工作的主要问题。根据自定义提供程序的实现方式,从服务器检索所有其他相关联(角色、配置文件等)。

    这不一定比会话更安全 - 如果站点不受 SSL 加密保护,它具有相同的 URL 或 cookie 重放漏洞(如果用户通过电子邮件将 URL 发送给其他人,则 URL 更糟)。

    【讨论】:

    • 有趣...在这个小实验中我什至没有考虑 SSL,但我计划在不久的将来在这个站点上实现 SSL。如果是这种情况,那么 Session 本身也将受到 SSL 的保护,对吗?
    • 是的,它也会保护它。未加密的无线网络是未加密的无线网络。
    【解决方案2】:

    看看微软是如何发布源代码的

    Provider Source

    还请记住,.Net 中没有黑匣子,您可以使用 Just Decomilereflector 了解更多关于其他人(Microsoft)如何完成您想做的事情。

    【讨论】:

    • 非常酷,我会花一些时间阅读这个。谢谢。
    【解决方案3】:

    除了所有的答案,我相信您帖子中的缺少的链接是 ASP.Net 表单身份验证 - 这实际上是在 ASP 中使用 ASP.Net Membership .Net 网络应用程序。

    因此,如果您拥有自己的数据库和身份验证方案(已经),您可以使用表单身份验证 - 即使 无需 尝试使其与会员资格一起使用(您真的没有到)。

    这是(很快成为我最常用的链接)overly simplistic MSDN example of Forms Authentication,该方案已硬编码。它向您展示了您甚至可以这样做 - 当然不是您应该这样做,而只是向您展示了可能性。

    正如上述所有答案所述,如果需要,您可以构建自己的提供程序。 (到目前为止)我走的最远的不是构建一个,而是自定义一些方法。原因:我有一个项目的现有用户数据库正在使用 MD5。这意味着我只是覆盖了 2 种方法(如果没记错的话)-ValidateUser()CreateUser()....

    【讨论】:

    • 这就是我一直在寻找的……很好的发现!似乎总是很难找到最简单的事情的例子。
    【解决方案4】:

    这是一个关于实现您自己的自定义 MembershipProvider 的优秀教程。

    http://www.codeproject.com/Articles/165159/Custom-Membership-Providers

    话虽如此,您确实需要阅读这篇文章。阅读文章并按照步骤操作后,您将开始了解问题的答案。除了经历像这样的教程的苦差事之外,真的没有很好的方法来理解它。至少,这是我的看法。通过阅读本教程,我第一次实现了我自己的自定义会员提供程序。几个小时后,我开始实现自己的加密算法。

    【讨论】:

    • 我实际上是在今天早些时候阅读了那篇文章。这是非常有用的信息,但我仍然不明白用户的身份验证状态如何在他们登录后在页面视图之间保持不变。例如,我希望看到对 FormsAuthentication.SetCookie() 或 GetUser( ) 方法或 ValidateUser() 方法。这会在调用 GetUser() 的方法中自动发生吗?
    • 是的 ASP.Net 使用 cookie 或 URL 参数自动处理该管道以检索身份令牌。
    • 实现我自己的加密算法是一个臭名昭著的坏主意。
    • 为了记录,我有一个学士学位。在计算机科学和研究密码学。我实际上所做的只是添加一个数据库密码盐 SHA512 算法。
    【解决方案5】:

    我强烈建议使用标准的会员资格提供程序,但创建一个链接表以将您现有的用户存储库加入到 asp 网络会员资格提供程序。两全其美。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-14
      • 2011-08-19
      • 2014-06-03
      • 2011-01-04
      • 2011-11-17
      • 1970-01-01
      相关资源
      最近更新 更多