Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 什么';与自定义ASP.NET成员资格提供商的交易是什么?_C#_Asp.net_Asp.net Mvc_Membership Provider - Fatal编程技术网

C# 什么';与自定义ASP.NET成员资格提供商的交易是什么?

C# 什么';与自定义ASP.NET成员资格提供商的交易是什么?,c#,asp.net,asp.net-mvc,membership-provider,C#,Asp.net,Asp.net Mvc,Membership Provider,我希望有人能帮我了解一下当我尝试实现一个定制的会员资格提供商时发生了什么。这可能更像是一个理论问题,而不是一个代码问题……以下是我的观点: MVC2应用程序(从一个空的MVC2项目开始) SQL Server DB和我自己的“用户”表 用户类、用户存储库、用户服务等等 目前,我的应用程序通过UserRepository进行身份验证,如果成功,它将返回一个用户对象。该用户对象随后存储在会话中,并随后由所有需要身份验证的控制器操作进行询问 现在…我明白了,将其存储在会话中会使我容易被会话劫持,而

我希望有人能帮我了解一下当我尝试实现一个定制的会员资格提供商时发生了什么。这可能更像是一个理论问题,而不是一个代码问题……以下是我的观点:

  • MVC2应用程序(从一个空的MVC2项目开始)
  • SQL Server DB和我自己的“用户”表
  • 用户类、用户存储库、用户服务等等
目前,我的应用程序通过UserRepository进行身份验证,如果成功,它将返回一个用户对象。该用户对象随后存储在会话中,并随后由所有需要身份验证的控制器操作进行询问

现在…我明白了,将其存储在会话中会使我容易被会话劫持,而更安全的方法是实现我自己的MembershipProvider。我不明白的是,这个自定义提供程序将在哪里存储我的用户对象?我看到重写的ValidateUser()方法只返回一个bool,但我无法确定在该用户在站点上的时间内,该信息在何处被持久化

我真的很想保留我现有的进程,同时通过消除对用户身份验证会话的依赖,使其更加安全。我喜欢在用户登录后在整个应用程序中拥有一个完整的用户对象供我使用,但我愿意接受其他方面的建议。似乎很多会员资格提供者文档都是一个黑盒子。我希望有人能解释一下它到底在做什么来保持用户身份验证


提前感谢

看看微软在发布源代码时的做法


还请记住,在.Net中没有任何东西是一个黑匣子,您可以使用它,也可以了解更多关于其他人(Microsoft)如何做了与您想做的相同的事情。

这里有一个关于实现您自己的自定义成员资格提供程序的优秀教程


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

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


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

除了所有答案,我相信你文章中缺少的链接是ASP.Net表单身份验证-这实际上是在ASP.Net web应用程序中使用的ASP.Net成员身份

因此,如果您已经有了自己的db和auth方案,您可以使用表单身份验证,即使,也不必尝试使其与成员身份一起工作(您真的不必这样做)

下面是一个(很快成为我最常用的链接)硬编码的方案。它向你展示了你甚至可以这样做——当然不是你应该这样做,而是向你展示了可能性

如上所述,如果需要,您可以构建自己的提供商。到目前为止,我所做的最远的工作不是构建一个,而是定制一些方法。原因:我的一个项目的现有用户db正在使用MD5。这意味着我只需要重写2个方法(如果内存可用的话)ValidateUser()和
CreateUser()


Hth

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

很酷,我会花一些时间来通读这篇文章。谢谢。我今天早些时候读了那篇文章。这是非常有用的信息,但我仍然不理解用户登录后如何在页面视图之间保持身份验证状态。例如,我希望在GetUser()方法或ValidateUser()方法中看到对FormsAuthentication.SetCookie()的调用或其他调用。在调用GetUser()的方法中是否会自动发生这种情况?是的,ASP.Net会使用cookie或URL参数来检索标识,从而自动处理管道。实现我自己的加密算法是一个众所周知的坏主意。我拥有计算机科学理学学士学位,并学习了密码学。实际上,我所做的只是在SHA512算法中添加了一个数据库密码。有趣的是,我在这个小实验中甚至没有考虑SSL,但我计划在不久的将来在这个站点上实现SSL。如果是这样的话,那么会话本身也会受到SSL的保护,对吗?是的,它也会保护它。在没有SSL的情况下,最容易暴露cookie的地方之一是未加密的无线网络。这就是我一直在寻找的…很好的发现!似乎总是很难找到最简单的事情的例子。