2

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

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

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

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

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

提前致谢

4

5 回答 5

1

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

提供者来源

还要记住,.Net 中没有黑匣子,您可以使用Just Decomile反射器来了解更多关于其他人(Microsoft)如何完成您想做的相同事情的信息。

于 2012-05-25T22:44:55.390 回答
1

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

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

于 2012-05-26T00:38:36.997 回答
1

除了所有答案之外,我相信您的帖子中缺少的链接是 ASP.Net Forms Authentication - 这实际上是在 ASP.Net Web 应用程序中使用ASP.Net Membership 的原因。

因此,如果您拥有自己的 db 和 auth 方案(已经),您可以使用 Forms Authentication - 即使尝试使其与 Membership 一起使用(您真的不必这样做)。

这是(很快成为我最常用的链接)一个过于简单的 MSDN 表单身份验证示例,其方案是硬编码的。它向您展示了您甚至可以这样做 - 当然不是您应该这样做,而只是向您展示了可能性。

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

Hth

于 2012-05-26T01:23:26.927 回答
0

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

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

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

于 2012-05-25T22:58:49.413 回答
0

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

于 2012-05-26T03:48:58.410 回答