ASP.NET应用中用C#实现基于表单的认证

转载 2004年07月19日 17:00:00
 
  • 微软ASP.NET (包括.NET框架)
  • 微软Visual C# .NET (2002)
  • 微软SQL Server 2000 (所有版本)
  • 微软SQL Server 版本7.0

如果您需要查阅本文的Microsoft Visual Basic .NET版本,请参见Q308157
本文引用了下列微软.NET框架类库的命名空间:
  • System.Data.SqlClient
  • System.Web.Security
本文内容

本文描述了如何通过使用一个数据库存贮用户信息来实现基于表单的认证。
返回
下面所列的是推荐的软、硬件和网络环境:
  • 微软Visual Studio .NET
  • 微软Internet Information Server (IIS) 版本5.0以上
  • 微软SQL Server
返回
  1. 打开Visual Studio .NET。
  2. 单击文件菜单,选择新建项目。
  3. 建立一个新的ASP.NET网络应用,并指定位置和名字。
返回
这一段描述了如何添加、修改之间的信息来设置ASP.NET应用使用基于表单的用户认证。
  1. 在项目浏览器中,打开Web.config文件。
  2. 属性中改变认证模式为Forms:mode="Forms"
  3. 后插入标签,并填入相应的属性。(要获得更多关于这些属性的信息,请参见MSDN文档,或者参见本文后面“参考文献”所列的快速入门文档。)拷贝下面的代码,并点击“编辑”菜单中的“作为HTML粘贴”选项,把这段代码粘贴到文件的段中:
  4. 段中添上拒绝匿名访问的代码,如下所示:
返回
本段主要介绍了如何建立一个简单的数据库来存储用户名、密码、和用户角色。您需要角色这一列来存储用户的角色信息,从而实现基于角色的安全体系。
  1. 在Windows“开始”菜单中,点击“运行”,并输入“notepad”来打开写字板。
  2. 选中下面的SQL脚本代码,右击这段代码,然后点击“拷贝”。在写字板中,点击“编辑”菜单中的“粘贴”选项来粘贴下面的代码:
    if exists (select * from sysobjects where id = object_id(N'[dbo].[Users]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) drop table [dbo].[Users] GO CREATE TABLE [dbo].[Users] ( [uname] [varchar] (15) NOT NULL , [Pwd] [varchar] (25) NOT NULL , [userRole] [varchar] (25) NOT NULL , ) ON [PRIMARY] GO ALTER TABLE [dbo].[Users] WITH NOCHECK ADD CONSTRAINT [PK_Users] PRIMARY KEY NONCLUSTERED ( [uname] ) ON [PRIMARY] GO INSERT INTO Users values('user1','user1','Manager') INSERT INTO Users values('user2','user2','Admin') INSERT INTO Users values('user3','user3','User') GO
  3. 将文件保存为User.sql。
  4. 用安装了微软SQL Server的机器,在Query Analyzer中打开刚刚建立的脚本User.sql。在工具栏的数据库列表中,选择数据库“pubs”,然后执行这个脚本。脚本中的这段代码建立了一个简单的用户表,并将数据库pubs中的表调整为在这个样例应用中能够使用的格式。
返回
  1. 在项目中添加一个web表单,命名为Logon.aspx。
  2. 拷贝下面的代码,并点击“编辑”菜单中的“作为HTML粘贴”选项,把这段代码粘贴到文件的 段中:

    Logon Page

    Email:<?XML:NAMESPACE PREFIX = ASP />
    Password:
    Persistent Cookie:

    这个web表单被用来显示用户一个登陆表单,以使他们能够输入用户名和密码来登陆应用。
  3. 切换到“设计”视图,并保存页面。
返回
本段介绍了登录界面对应的code-behind页面中的代码(Logon.aspx.cs)。
  1. 双击“Logon按钮”来打开Logon.aspx.cs文件。
  2. 在该文件中导入需要的命名空间:
    using System.Data.SqlClient; using System.Web.Security; 
  3. 建立一个ValidateUser函数通过在数据库中查找的方法来验证用户身份。(确保您改变了Connection string以使它指向您的数据库)
    private bool ValidateUser(string uid, string passwd) { SqlConnection cnn; SqlCommand cmd; SqlDataReader dr; cnn = new SqlConnection("server=localhost;uid=sa;pwd=password;database=pubs"); cmd = new SqlCommand("Select *from users where uname='" + uid + "'",cnn); cnn.Open(); dr = cmd.ExecuteReader(); while (dr.Read()) { if (string.Compare(dr["Pwd"].ToString(),passwd,false)==0) { cnn.Close(); return true; } } cnn.Close(); return false; } 
  4. 您可以使用下列两种方法之一来产生认证cookie并在cmdLogin_ServerClick事件中将用户重定向到适当的页面。我们提供了两种方法的样例代码,您可以根据需求来使用它们中的任意一个。
    • 调用RedirectFromLoginPage方法来自动产生表单的认证cookie,并在cmdLogin_ServerClick事件中将用户重定向到适当的页面:
      private void cmdLogin_ServerClick(object sender, System.EventArgs e) { if (ValidateUser(txtUserName.Value,txtUserPass.Value) ) FormsAuthentication.RedirectFromLoginPage(txtUserName.Value, chkPersistCookie.Checked); else Response.Redirect("logon.aspx", true); } 
    • 生成认证令牌并对它进行加密,利用加密结果建立一个cookie,并将其添加到Response的cookies中,最后重定向页面。使用这个方法,您可以在如何创建cookie方面得到更多的控制权,还可以在FormsAuthenticationTicket中包含一些自定义数据:
      private void cmdLogin_ServerClick(object sender, System.EventArgs e) { if (ValidateUser(txtUserName.Value,txtUserPass.Value) ) { FormsAuthenticationTicket tkt; string cookiestr; HttpCookie ck; tkt = new FormsAuthenticationTicket(1, txtUserName.Value, DateTime.Now, DateTime.Now.AddMinutes(30), chkPersistCookie.Checked, "your custom data"); cookiestr = FormsAuthentication.Encrypt(tkt); ck = new HttpCookie(FormsAuthentication.FormsCookieName, cookiestr); if (chkPersistCookie.Checked) ck.Expires=tkt.Expiration; Response.Cookies.Add(ck); string strRedirect; strRedirect = Request["ReturnUrl"]; if (strRedirect==null) strRedirect = "default.aspx"; Response.Redirect(strRedirect, true); } else Response.Redirect("logon.aspx", true); } 
  5. 请确认以下代码已被添加到了由表单设计器自动产生的InitializeComponent函数中:
    this.cmdLogin.ServerClick += new System.EventHandler(this.cmdLogin_ServerClick); 
返回
本节建立了一个测试页面,用户通过认证后将被重定向到这个页面。如果用户没有事先登录就试图访问本页面,则他们会被重定向到登录页面上。
  1. 重命名已经存在的WebForm1.aspx页面为Default.aspx,并在编辑器中打开。
  2. 切换到“HTML”视图,并把下面的代码拷贝到标签中间:
    该按钮将被用来注销认证的session。
  3. 切换的“设计”视图,并保存页面。
  4. 在code-behind页面中导入需要的命名空间:
    using System.Web.Security; 
  5. 双击SignOut来打开code-behind页面(Default.aspx.cs),并拷贝下面的代码到cmdSignOut_ServerClick事件响应函数中:
    private void cmdSignOut_ServerClick(object sender, System.EventArgs e) { FormsAuthentication.SignOut(); Response.Redirect("logon.aspx", true); } 
  6. 请确保下面的代码被添加到了由表单设计器自动产生的InitializeComponent函数中:
    this.cmdSignOut.ServerClick += new System.EventHandler(this.cmdSignOut_ServerClick); 
  7. 保存并编译项目。您现在就可以只用这个应用了。
返回
  • 您可能会想要安全地在数据中存储密码。您可以使用FormsAuthentication类工具中的HashPasswordForStoringInConfigFile函数在您存储密码前对它进行加密。
  • 您可能会想要将SQL连接信息存储到设置文件(Web.config)中,以便您能够容易地在需要的时候修改。
  • 如果考虑添加一些代码来防止黑客使用不同的密码组合试图登录。则您可以在代码中限制登录次数(例如2-3次)。如果一个用户接连几次都没能登录成功,则还可以通过在数据库中设置一个标志位来阻止该用户登录,直到他通过别的页面或者打您的服务支持热线重新激活了该账号。另外,应该考虑在必要的时候适当增加错误处理函数。
  • 由于用户人正是基于认证cookie的,您可能想要在应用中使用Secure Sockets Layer (SSL),从而没有人能够欺骗认证cookie。
  • 基于表单的认证需要您在客户端启用并允许使用cookie。
  • 设置的timeout参数控制了认证cookie产生的时间间隔,您可以选择一个参数值,以获得良好的性能和安全性。
  • 互联网上的一些中间代理和缓存可能会缓存包含cookie设置头部的Web服务器响应,接着这些响应返回给不同的用户。因为基于表单的认证通过cookie来认证用户,引起的后果是,用户可以从中间代理或缓存获得本应返回给其他用户的cookie,无意(或有意)的模仿其他用户。下面的文章解释了如何解决这个问题。
    Q263730 Site Server Users May Be Authenticated Under the Wrong Account

ASP.NET MVC 表单验证方式总结

一、绑定参数的表单验证:(通过ValidationAttribute特性绑定到Model来验证) 1.引入js文件: jquery的某个版本 jquery.validate.js jquery.val...
  • zhulongxi
  • zhulongxi
  • 2016年05月07日 10:43
  • 4665

asp.net中通过form表单submit提交到后台的实例

asp.net中通过form表单submit提交到后台的实例 前台中的代码: body>     div id="top"> div>...
  • Metal1
  • Metal1
  • 2015年03月20日 09:37
  • 4210

ASP.NET MVC 表单的几种提交方式

下面是总结一下在ASP.NET MVC中表单的几种提交方式。   1.Ajax提交表单 需要引用                    第1个为Jquery...
  • jiangfei009003
  • jiangfei009003
  • 2014年07月25日 20:22
  • 2461

ASP.NET Core集成现有系统认证

我们现在大多数转向ASP.NET Core来使用开发的团队,应该都不是从0开始搭建系统,而是老的业务系统已经在运行,ASP.NET Core用来开发新模块。那么解决用户认证的问题,成为我们的第一个拦路...
  • sD7O95O
  • sD7O95O
  • 2017年11月09日 00:00
  • 114

asp.net 调用带证书的webservice解决办法

最近在朋友弄一个调整省政府政务工作流的程序。。 需要把当前的信息推送到政务网上,采用的是带证书的https webservice。。 下面说一下实现过程 第一步,引用webservice地...
  • 4color
  • 4color
  • 2016年07月06日 23:02
  • 1538

ASP.NET MVC:窗体身份验证及角色权限管理示例

前言   本来使用Forms Authentication进行用户验证的方式是最常见的,但系统地阐明其方法的文章并不多见,网上更多的文章都是介绍其中某一部分的使用方法或实现原理,而更多的朋友则发文询...
  • hpnets
  • hpnets
  • 2015年03月07日 18:20
  • 4783

ASP.NET MVC4 身份认证和授权

寒假准备对我们团队开发的各个小系统进行整合和重写,由于这些系统需求分析并不够仔细,所以在后期缝缝补补,加上人员交替,使得代码结构凌乱不堪,让我这个有代码洁癖的人难受的要死,所以打算重新梳理,由于我们团...
  • wslpeter1987
  • wslpeter1987
  • 2016年03月19日 16:52
  • 1132

Asp.Net MVC中身份认证和授权

 http://blog.csdn.net/kenshincui/article/details/5559508 MVC自带的ActionFilter 在Asp.Net WebFor...
  • Lyncai
  • Lyncai
  • 2015年03月16日 21:09
  • 3192

ASP.NET里面的身份验证和授权(一)

在学习ASP.NET中,接触到了里面的身份验证和授权。我们就来具体总结一下这方面的知识。说到身份验证,我们以前的身份验证和授权都是基于Session来做的,都是从数据库中进行查找,比如说登陆的页面,我...
  • huanjileaimeidan
  • huanjileaimeidan
  • 2013年12月04日 10:00
  • 3532

认证模式之Form模式

上面介绍的两种模式都属于HTTP协议规范范畴,由于它的规范使得很多东西无法自定义,例如登录窗口、错误展示页面。所以需要另外一种模式提供更加灵活的认证,也就是基于Form的认证模式。Form模式的认证流...
  • wangyangzhizhou
  • wangyangzhizhou
  • 2016年04月15日 18:13
  • 4908
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ASP.NET应用中用C#实现基于表单的认证
举报原因:
原因补充:

(最多只允许输入30个字)