如何创建用于登录的cookie?或者我应该坚持使用asp.net会员资格?

时间:2009-09-20 07:06:26

标签: .net asp.net-mvc asp.net-membership

我正在使用asp.net MVC和asp.net会员资格,但我开始认为我没有必要使用Asp.net会员资格。

所以我想弄清楚如何使用相同的字段和asp.net成员资格生成相同类型的cookie。

还有我需要的其他设置吗?喜欢像“User.Identity.Name”这样的东西怎么样?喜欢它在哪里设置?这是从cookie中抓取还是什么?或者这是来自别的什么?

与“Page.User.Identity.Name”相同。

asp.net会员资格是否设置了其他任何我不知道的东西,这可能会像asp.net MVC中的授权标签那样搞砸了?

我不太了解登录/身份验证和那些东西是如何起作用的,因为我总是使用asp.net会员资格。


请阅读下面的原因,如果您想知道我为什么要放弃asp.net会员资格


我喜欢asp.net会员资格,如果你似乎不需要做很多改动或者你需要快速的东西,那么它很好用。

根据我的需要,我认为这不适合我。我知道你可以使用提供者模型并覆盖它,但也许它只是我不明白(我真的没有太多关注它)但我发现它也有限制。

我如何理解你可以使用它来覆盖所有类或类似的东西。但是,如果你只是覆盖它,你不必使用相同的参数吗?就像我猜你可以做超载和东西但那些你不能再使用那些只是漂浮在那里然后空了?

接下来,即使你满足于此,我还会遇到这个问题吗?我允许重复的userNames,因为我有简单的方法通过查看其他字段来判断哪个用户是哪个。我需要重复的用户名,否则我可以看到潜在的问题。

因此,由于这些重复的名称,我甚至无法加载asp.net会员管理网站,因为它返回时出现了有关重复名称的错误。

接下来我有可能被认为是2个独立的数据库我不想分开数据库,因为我想保持低成本。所以现在我有2个派生自asp.net用户表的表。第一个表存储某种类型的用户,另一个表存储另一个类型的其他用户,所以如果我摆脱了asp.net成员资格表,我可以把它们作为这两个表的基表,如果我决定的话将它们分开是非常容易的。

所以这些原因以及我基本上都有自己的方法来处理我需要的所有内容(已经编写过)并且我没有使用asp.net成员资格中的任何内置方法,我想我应该放弃它并从中免费它的限制。

如果您只想将默认数据库移植到另一个数据库(例如mysql),那么提供者模型似乎很好,但是我只是没有注意到它,但这可能是因为我对它知之甚少。

3 个答案:

答案 0 :(得分:2)

您可以轻松创建自己的身份验证方法。对于认真的网络项目,我会一直这样做。使用像Membership这样的系统的问题在于,当您发现它缺少某个功能时,您无法实现该功能。

您需要做的第一件事是创建一个登录页面。在这里,您可以实现检查用户的用户名和密码(或证书,或者他们可以登录)的功能。然后存储一个表示用户名的cookie。 AFAIK,asp.net会员存储了用户的用户名的加密版本。这是恕我直言不是很安全,因为黑客只需要知道服务器的机器密钥,以模仿网站上的任何用户。我个人使用System.Security.Cryptography.RandonNumberGenerator为用户生成一个长二进制令牌,我将其与用户ID一起存储在一个表中。然后将此令牌传递给cookie中的用户。

现在,您需要实施Application_AuthenticateRequest事件。在这里,您阅读cookie,然后检查该cookie是否与有效用户相对应。是这样,您将HttpContext.Current.User属性设置为有效的IPrincipal。框架中有一个简单的IPrincipal实现GenericPrincipal。该对象还包含用户的角色。

之后与身份验证和身份验证有关的所有事情,只检查HttpContext.Current.User。这意味着Page.User设置为您设置的值。如果您设置了目录级安全性,即可能只有某些角色可以访问Web应用程序中的特定文件夹,那么它将起作用等。

这实际上是.net 1.0中的旧表单身份验证方法。成员资格只是表单身份验证之上的一个层构建。

答案 1 :(得分:1)

如果需要,您可以通过实现自定义属性并使用它来装饰控制器操作来创建自己的授权方案。

要注意的一件事是缓存。如果以直接的方式实现授权,然后在某个内部(仅限帐户)方法上启用缓存,则最后生成的操作输出将提供给任何要求它的人(在指定的缓存持续时间内)。

我们前几天进行了非常类似的讨论:Is it possible to create a Logon System with ASP.NET MVC but not use the MembershipProvider?

答案 2 :(得分:1)

您需要的只是在成功登录后创建cookie:

FormsAuthentication.SetAuthCookie("username", false);

当你需要退出时,只需使用:

FormsAuthentication.SignOut();

User.Identity.Name将起作用,因为它会查找身份验证cookie,如果它与请求一起发送,它将解密它并读取存储在其中的用户名。您可以使用任何东西进行用户身份验证和授权。