与自定义ASP.NET MembershipProviders有什么关系?

时间:2012-05-25 22:38:21

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

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

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

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

现在......我明白在会话中存储它会让我容易受到会话劫持的影响,而且更安全的方法是实现我自己的MembershipProvider。我不明白的是,这个自定义Provider最终会在哪里存储我的User对象?我看到被覆盖的ValidateUser()方法只返回一个bool,但我无法弄清楚该用户在网站上的时间信息的持久性。

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

提前致谢

5 个答案:

答案 0 :(得分:1)

看看微软在那里发布源代码的方式

Provider Source

还记得.Net中没有任何黑盒子你可以使用Just Decomilereflector来了解其他人(微软)如何做你想做的事情。

答案 1 :(得分:1)

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

这比会话更安全并不一定 - 如果网站不受SSL加密保护,它会有相同的URL或cookie重放漏洞(如果用户通过网址向其他人发送电子邮件,则会更糟糕地使用URL)。 / p>

答案 2 :(得分:1)

除了所有答案之外,我相信您帖子中的缺少链接是ASP.Net Forms身份验证 - 这实际上是ASP中使用 ASP.Net成员身份的原因.Net网络应用程序。

因此,如果你有自己的数据库和身份验证方案(已经),你可以使用它进行表单身份验证 - 甚至没有尝试使其与成员身份一起工作(你真的没有到)。

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

正如上述所有答案所述,您可以根据需要建立自己的提供商。我去过的最远的(到目前为止)还没有建立一个,但只是定制了一些方法。原因:我所拥有的项目的现有用户数据库正在使用MD5。这意味着我只是覆盖了2种方法(如果内存服务的话) - ValidateUser()CreateUser() ....

H个

答案 3 :(得分:0)

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

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

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

答案 4 :(得分:0)

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