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

什么';这是在ASP.NET中开发自定义登录/身份验证系统的最佳方法,.net,authentication,forms,login,.net,Authentication,Forms,Login,我正在开发的网站将允许用户在3个级别登录 级别1-未登录 第二级-他们注册自己的电子邮件地址并收到确认电子邮件,然后以这种方式登录 第2级-他们使用用户名/密码登录,然后发送到web服务。如果web服务返回“成功登录”结果,则他们将登录到该网站 根据登录级别,某些网页将可用,而其他网页将受到限制 我的问题是,我应该如何发展这一点 我正在用ASP.NETMVC做这个项目 我应该只编写自己的AccountController吗?我应该使用.NET窗体身份验证吗?与仅使用.NET代码手动执行表单身份验

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

级别1-未登录

第二级-他们注册自己的电子邮件地址并收到确认电子邮件,然后以这种方式登录

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

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

我的问题是,我应该如何发展这一点

我正在用ASP.NETMVC做这个项目

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


如果我自己这样做的话,在成功登录时,我会将登录的用户存储在会话变量中。这样做有什么害处吗?或者对于我正在做的事情,这样做可以吗?

我强烈建议不要使用您自己的身份验证系统。net Forms auth非常容易使用;你为什么要浪费时间自己建造它?身份验证系统有很多陷阱,除非你是MS,否则你真的没有资源来构建和测试一个

确定用户可以看到哪些页面是授权,您当然可以按照自己的方式编写代码。我建议研究.net中可用的标识/主体接口,并重写“IsInRole”方法以满足您的需要


会话对安全性不是很好。它们在web场场景中无法正常工作,当应用程序池决定回收时,您的所有用户都已注销。net forms auth默认使用cookies。

在您的情况下,我建议使用简单的表单身份验证。(见附件)。一个简单的LoginController可以处理这个问题

在会话中存储用户配置文件数据并没有什么“错误”,但如果您需要平衡web站点的负载,这可能会导致可伸缩性问题。推荐的方法是实现自定义RoleProvider。(见附件。)


至于访问控制,也许您可以使用一个BaseController类来检查用户的当前角色,以查看他们具有何种访问权限。

请检查前面的问题,以便:


查看关于ASP.Net MVC成员资格基础的博客。

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

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

我必须承认,在ASP.NET的“标准”内置成员资格提供商中,有一件事我发现很不寻常,那就是没有一种简单的方法允许用户注册网站,但不立即“验证”他们的帐户,而是向用户发送一封包含“验证链接”的电子邮件他们必须单击才能访问该网站。虽然这不是ASP.NET MembershipProvider类中的标准功能,但它相对容易实现

Scott Mitchell撰写了一系列关于ASP.NET成员资格、角色和配置文件提供程序(包括允许登录前通过电子邮件验证帐户)的文章,可在此处找到:


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

您正在查看的身份验证方法是什么?目前,我正在考虑从头开始创建自己的AccountController,使用“LogIn”方法,接受“emailaddress”作为参数。如果emailaddress在数据库中,它会将会话变量“CurrentUser”设置为该数据库记录。有什么理由不这样做吗?我说,推出自己的系统要比试图了解ASP.NET成员资格是如何工作的容易得多。此外,我不希望在我的数据库中驻留成百上千个支持ASP.NET成员资格的不必要的表、视图和存储过程。