在ASP.NET中开发自定义登录/身份验证系统的最佳方法是什么

时间:2009-02-24 04:05:58

标签: .net authentication forms login

我正在开发的网站将允许用户在3个级别登录。

等级1 - 未登录

2级 - 他们注册他们的电子邮件地址并收到确认电子邮件,并以此方式登录。

级别2 - 他们使用用户名/密码登录,然后将其发送到Web服务。如果Web服务返回“成功登录”结果,则会登录到网站。

根据登录级别,某些网页可用,而其他网页则受限制。

我的问题是,我应该如何发展这个?

我在ASP.NET MVC中做这个项目。

我应该只编写自己的AccountController吗?我应该使用.NET Forms身份验证吗?使用.NET代码手动执行表单身份验证有什么好处?

如果我自己这样做,在成功登录后,我只会将登录用户存储在会话变量中。这样做是否有任何伤害,或者我正在做什么,是否可以?

4 个答案:

答案 0 :(得分:4)

在SO中查看上一个问题:

How should I implement user membership in my ASP.NET MVC site?

查看有关ASP.Net MVC会员基础知识的this博客。

答案 1 :(得分:1)

我强烈反对滚动您自己的身份验证系统。 .net Forms auth太容易使用;为什么你会浪费时间自己建造它?身份验证系统存在许多缺陷,除非您是MS,否则您实际上没有资源来构建和测试身份验证系统。

确定用户可以看到的页面是授权,您当然可以按自己的方式编码。我建议查看.net中可用的Identity / Principal接口,并覆盖“IsInRole”方法以满足您的需求。

会话对安全性并不是很好。它们在Web场方案中不能很好地工作,并且当应用程序池决定回收时...所有用户都已注销。 .net表单auth默认使用cookie。

答案 2 :(得分:1)

我建议编写自己的自定义成员身份/身份验证系统的最佳方法是在.NET中实际使用内置的MembershipProvider类,并从中派生自己的自定义类。您始终可以通过继承.NET框架内的System.Web.Security.MembershipProvider(以及RoleProfile类!)类来创建自己的成员资格提供程序,并提供您自己的特定实现。这样,您就可以使用可靠的“基础框架”来构建您的身份验证和授权系统。

通过框架自己的基类派生自定义成员资格提供程序,您可以利用内置的ASP.NET成员资格系统的许多强大功能,例如web.config文件中的声明性授权和构建-in ASP.NET身份验证票证。我回答了一个非常类似的问题here,详细介绍了其中的一些好处。

我必须承认,有一件事我觉得很不寻常,因为它在ASP.NET中的“标准”内置成员资格提供程序中的遗漏是缺少一种允许用户注册网站而不是“验证”的简单方法“他们立即开立帐户,而是向用户发送包含”验证链接“的电子邮件,在允许访问网站之前,必须先单击这些链接。虽然这不是ASP.NET MembershipProvider类中的标准功能,但它实现起来相对容易。

Scott Mitchell撰写了一系列关于ASP.NET的成员资格,角色和个人资料提供者的文章(包括关于允许登录前通过电子邮件验证帐户的文章),可以在这里找到:

Examining ASP.NET 2.0's Membership, Roles, and Profile

如果您从ASP.NET提供程序派生自己的自定义提供程序,这应该会有所帮助。

答案 3 :(得分:0)

在您的情况下,我建议使用简单的表单身份验证。 (见How to: Implement Simple Forms Authentication)。一个简单的LoginController可以处理这个。

在会话中存储用户配置文件数据没有“错误”,但如果您需要对网站进行负载平衡,则可能会导致可伸缩性问题。建议的方法是实现自定义RoleProvider。 (见Implementing a Role Provider。)

对于访问控制,也许你可以有一个BaseController类来检查用户当前的角色,看看他们有什么样的访问权。