在ASP.NET中如何用C#.NET实现基于表单的验证
这篇文章引用到了Microsoft .NET类库中的以下名空间:
System.Data.SqlClient
System.Web.Security
-------------------------------
任务:
摘要:
1.要求
2.用Visual C#.NET 创建一个ASP.NET 应用程序
3.在Web.config文件里配置安全设置
4.创建一个数据库表样例来存放用户资料
5.创建Logon.aspx页面
6.编写事件处理代码来验证用户身份
7.创建一个Default.aspx页面
8.附加提示
参考文章
-------------------------------
摘要
这篇文章示范了如何实现通过数据库存储用户信息来实现基于表单的验证.
(一)要求
需要以下工具来实现
1.Microsoft Visual Studio.NET
2.Microsoft Internet Information Services(IIS) version 5.0 或者更新
3.Microsoft SQL Server
(二)用C#.NET创建ASP.NET应用程序
1.打开Visual Studio.NET
2.建立一个新的ASP.NET Web应用程序,并且指定名称和路径.
(三)在Web.config文件里配置安全设置
这一节示范了如何通过添加和修改<authentication>和<authorization>节点来配置ASP.NET应用程序以实现基于表单的验证.
1.在解决方案窗口里,打开Web.config文件.
2.把authentication模式改为Forms(注:默认为windows)
3.插入<Forms>标签,并且填入适当的属性.(请链接到在文章最后列出的MSDN文档或者QuickStart文档来查看这些属性)先复制下面的代码,接着再把它粘贴到<authentication>节:
<authentication mode="Forms">
<form name=".ASPXFORMSDEMO" loginUrl="logon.aspx" protection="All" path="/" timeout="30"/>
</authentication>
(注:如果不指定loginUrl,默认为default.aspx)
4.通过加入以下节点实现拒绝匿名访问:
<authentication>
<deny users="?"/>
<allow users="*"/>
</authentication>
(四)创建一个数据库表样例来存放用户资料
这一节示范了如何创建一个示例数据库来存放用户名,密码,和用户角色.如果你想要实现基于角色的安全就有必要在数据库中添加一个存放用户角色的字段.
1.打开记事本。
2.把下面这段脚本复制到记事本然后保存:
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.打开Microsoft SQL Server,打开查询分析器,在数据库列表里选择Pubs数据库,然后把上面的脚本粘贴过来,运行。这时会在Pubs数据库里创建一个将会在这个示例程序中用到的示例用户表。
(五)创建Logon.aspx页面
1.在已创建好的项目里创建一个新的Web 窗体,名为Logon.aspx。
2.在编辑器里打开Logon.aspx,切换到HTML视图。
3.复制下面代码,然后在编辑菜单里“选择粘贴为HTML”选项,插入到<form>标签之间。
<h3>
<font face="Verdana">Logon Page</font>
</h3>
<table>
<tr>
<td>Email:</td>
<td><input id="txtUserName" type="text" runat ="server"></td>
<td><ASP:RequiredFieldValidator ControlToValidate="txtUserName"
Display="Static" ErrorMessage="*" runat ="server"
ID="vUserName" /></td>
</tr>
<tr>
<td>Password:</td>
<td><input id="txtUserPass" type="password" runat ="server"></td>
<td><ASP:RequiredFieldValidator ControlToValidate="txtUserPass"
Display="Static" ErrorMessage="*" runat ="server"
ID="vUserPass" />
</td>
</tr>
<tr>
<td>Persistent Cookie:</td>
<td><ASP:CheckBox id="chkPersistCookie" runat ="server" autopostback="false" /></td>
<td></td>
</tr>
</table>
<input type="submit" Value="Logon" runat ="server" ID="cmdLogin"><p></p>
<asp:Label id="lblMsg" ForeColor="red" Font-Name="Verdana" Font-Size="10" runat ="server" />
这个页面用来显示一个登录表单以便用户可以提供他们的用户名和密码,并且记录到应用程序中。
4.切换到设计视图,保存这个页面。
(六)编写事件处理代码来验证用户身份
下面这些代码是放在后置代码页里的(Logon.aspx.cs)
1.双击Logon页面打开Logon.aspx.cs文件。
2.在后置代码文件里导入必要的名空间:
using System.Data.SqlClient;
using System.Web.Security;
3.创建一个ValidateUser的函数,通过在数据库中查找用户来验证用户的身份。(请改变菘饬幼址粗赶蚰愕氖菘猓?BR>private bool ValidateUser( string userName, string passWord )
{
SqlConnection conn;
SqlCommand cmd;
string lookupPassword = null;
// Check for invalid userName.
// userName must not be null and must be between 1 and 15 characters.
if ( ( null == userName ) || ( 0 == userName.Length ) || ( userName.Length > 15 ) )
{
System.Diagnostics.Trace.WriteLine( "[ValidateUser] Input validation of userName failed." );
return false;
}
// Check for invalid passWord.
// passWord must not be null and must be between 1 and 25 characters.
if ( ( null == passWord ) || ( 0 == passWord.Length ) || ( passWord.Length > 25 ) )
{
System.Diagnostics.Trace.WriteLine( "[ValidateUser] Input validation of passWord failed." );
return false;
}
try
{
// Consult with your SQL Server administrator for an appropriate connection
// string to use to connect to your local SQL Server.
conn = new SqlConnection( "server=localhost;Integrated Security=SSPI;database=pubs" );
conn.Open();
// Create SqlCommand to select pwd field from users table given supplied userName.
cmd = new SqlCommand( "Select pwd from users where uname=@userName", conn );
cmd.Parameters.Add( "@userName", SqlDbType.VarChar, 25 );
cmd.Parameters["@userName"].Value = userName;
// Execute command and fetch pwd field into lookupPassword string.
lookupPassword = (string) cmd.ExecuteScalar();
// Cleanup command and connection objects.
cmd.Dispose();
conn.Dispose();
}
catch ( Exception ex )
{
// Add error handling here for debugging.
// This error message should not be sent back to the caller.
System.Diagnostics.Trace.WriteLine( "[ValidateUser] Exception " + ex.Message );
}
// If no password found, return false.
if ( null == lookupPassword )
{
// You could write failed login attempts here to event log for additional security.
return false;
}
// Compare lookupPassword and input passWord, using a case-sensitive comparison.
return ( 0 == string.Compare( lookupPassword, passWord, false ) );
}
(注:这段代码的意思是先判断输入的用户名和密码是否符合一定的条件,如上,如果符合则连接到数据库,并且根据用户名来取出密码并返回密码,最后再判断取出的密码是否为空,如果不为空则再判断取出的密码和输入的密码是否相同,最后的false参数为不区分大小写)
4.在cmdLogin_ServerLick事件里使用下面两种方法中的一种来产生表单验证的cookie并将页面转到指定的页面。
下面提供了两种方法的示例代码,根据你的需要来选择。
a)在cmdLogin_ServerClick事件里调用RedirectFromLoginPage方法来自动产生表单验证cookie且将页面定向到一个指定的页面。
private void cmdLogin_ServerClick(object sender,System.EventArgs e)
{
if(ValidateUser(txtUserName.value,txtUserPass.Value))
FormsAuthentication.RedirectFromLoginPage(txtUserName.Value,chkPresistCookie.Checked);
else
Response.Redirect("logon.aspx",true);
}
b)产生加密验证票据,创建回应的cookie,并且重定向用户。这种方式给了更多的控制权去让你如何去创建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);// 创建cookie
if(chkpersistCookie.Checked) //如果用户选择了保存密码
ck.Expires=tkt.Expiratioin;//设置cookie有效期
ck.Path=FormsAuthentication.FormsCookiePath;//cookie存放路径
Response.Cookies.Add(ck);
string strRedirect;
strRedirect=Request["ReturnUrl"];
if(strRedirect==null)
strRedirect="default.aspx";
Response.Redirect(strRedirect,true);
}
else
Reponse.Redirect("logon.aspx",true);
}
5.请确保在InititalizeComponent方法里有如下代码:
this.cmdLogin.ServerClick += new System.EventHandler(this.cmdLogin_ServerClick);
(七)创建一个Default.aspx页面
这一节创建一个测试页面用来作为当用户验证完之后重定向到的页面。如果用户第一次没有被记录下来就浏览到这个页,这时用户将被重定向到登录页面。
1.把现有的WebForm1.aspx重命名为Default.aspx,然后在编辑器里打开。
2.切换到HTML视图,复制以下代码到<form>标签之间:
<input type="submit" Value="SignOut" runat ="server" id="cmdSignOut">
这个按钮用来注销表单验证会话。
3.切换到设计视图,保存页面。
4.在后置代码里导入必要的名空间:
using System.Web.Security;
5.双击SingOut按钮打开后置代码(Default.aspx.cs),然后把下面代码复制到cmdSingOut_ServerClick事件处理中:
private void cmdSignOut_ServerClick(object sender,System.EventArgs e)
{
FormsAuthentication.SignOut();//注销
Response.Redirect("logon.aspx",true);
}
6.请确认在InititalizeComponent方法中有以下代码:
this.cmdSignOut.ServerClick += new System.EventHandler(this.cmdSignOut_ServerClick);
7.保存编译项目,现在可以运行这个应用程序了。
(八)附加提示
1.如果想要在数据库里安全地存放密码,可以在存放到数据到之前先用FormsAuthentication类里的HashPasswordForStoringInConfigFile函数来加密。(注:将会产生一个哈希密码)
2.可以在配置文件(Web.config)里存放SQL连接信息,以便当需要时方便修改。
3.可以增加一些代码来防止黑客使用穷举法来进行登录。例如,增加一些逻辑使用户只能有两三次的登录机会。如果用户在指定的登录次数里无法登录的话,可以在数据库里设置一个标志符来防止用户登录直到此用户访问另一个页面或者请示你的帮助。另外,也可以在需要时增加一些适当的错误处理。
4.因为用户是基于验证cookie来识别的,所以可以在应用程序里使用安全套接层(SSL)来保护验证cookie和其它有用的信息。
5.基于表单的验证方式要求客户端的游览器接受或者启用cookies.
6.在<authentication>配置节里的timeout参数用来控制验证cookies重新产生的间隔时间。可以给它赋一个适当的值来提供更好的性能和安全性。
7.在Internet上的一些代理服务器或者缓冲可能会缓存一些将会重新返回给另外一个用户的包含Set-Cookie头的Web服务器响应。因为基于表单的验证是使用cookie来验证用户的,所以通过中间代理服务器或者缓冲的话可能会引起用户会被意外地搞错为原本不是要发送给他的用户。
参考文章:
如果想要知道如何通过配置<credentials>节点存放用户名和密码来实现基于表单的验证的话,请参考以下GotDotNet ASP.NET QuickStart示例:
基于表单的验证:http://www.gotdotnet.com/QuickStart/aspplus/default.aspx?url=/quickstart/aspplus/doc/formsauth.aspx
如果想要知道如何使用XML文件来存放用户名和密码来实现基于表单的验证的话,请参考SDK文档的以下示例:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconcookieauthenticationusinganxmlusersfile.asp
如果想要知道更多的关于ASP.NET安全的话,请参考Microsoft .NET Framework Developer's Guide文档:
ASP.NET 安全: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconaspnetwebapplicationsecurity.asp
如果想知道更多关于System.Web.Security名空间的话,请参考:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfSystemWebSecurity.asp
如果想知道更多的关于ASP.NET配置的话,请参考Microsoft .NET Framework Developer's Guide文档:
ASP.NET配置:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconaspnetconfiguration.asp
ASP.NET配置节点:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpgrfaspnetconfigurationsections.asp
如果想知道更多关于ASP.NET安全指导的话,请参考MSDN:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnbda/html/authaspdotnet.asp
如果想知道更多关于ASP.NET的,请参考MSDN新闻组:
http://go.microsoft.com/fwlink/?linkid=5811&clcid=0x409
这篇文章适用于:
Microsoft ASP.NET (included with the .NET Framework 1.1)
Microsoft Visual C# .NET (2003)
Microsoft ASP.NET (included with the .NET Framework) 1.0
Microsoft Visual C# .NET (2002)
Microsoft SQL Server 2000 (all editions)
Microsoft SQL Server 7.0
Microsoft SQL Server 2000 64 bit (all editions)
在ASP.NET中如何用C#.NET实现基于表单的验证相关推荐
- [转]在ASP.NET中如何用C#.NET实现基于表单的验证(二)
(五)创建Logon.aspx页面 1.在已创建好的项目里创建一个新的Web 窗体,名为Logon.aspx. 2.在编辑器里打开Logon.aspx,切换到HTML视图. 3.复制下面代码,然后在编 ...
- ASP.NET 完成基于表单的身份验证
实现:验证用户身份成功,并登陆后台Admin文件夹里的index.aspx后台管理首页面,否则禁止匿名用户访问项目中的Admin文件夹里的任何一个文件. 步骤一: 在根目录下的web.config ...
- 在asp.net中如何用javascript读取本地Xml中的数据到网页中的文本框?
在asp.net中如何用javascript读取本地Xml中的数据到网页中的文本框? 转载于:https://www.cnblogs.com/dynasty/archive/2005/08/18/21 ...
- 傻瓜教程:asp.net(c#) 如何配置authentication,完成基于表单的身份验证
傻瓜老师又来了,本讲座报以学以致用,师傅带进门 修行靠个人的精神,不深入探讨,还请多指教~ 这堂课将的是基于表单的身份验证,其实某些时候,用于验证身份的账户和密码并不需要存在数据库或配置文件里,这时 ...
- 【FBA】SharePoint 2013自定义Providers在基于表单的身份验证(Forms-Based-Authentication)中的应用...
//http://www.cnblogs.com/OceanEyes/p/custom-provider-in-sharepoint-2013-fba-authentication.html 由于项目 ...
- [RFC1867] HTML中基于表单的文件上传
网络工作组:E. Nebel 征求意见:1867 L. Masinter 类别:试验 施乐公司 十一月 1995 HTML中基于表单的文件上传 这个备忘录的状态 这个备忘录为互联网社区定义了一个试验协 ...
- ASP.NET 安全认证(二)——灵活运用 Form 表单认证中的 deny 与 allow 及保护 .htm 等文件 ....
话说上回,简单地说了一下 Form 表单认证的用法.或许大家觉得太简单,对那些大内高手来说应该是"洒洒水啦""小 Kiss 啦(小意思)".今天咱们来点的花样吧 ...
- ASP.NET 安全认证(三)—— 用Form 表单认证实现单点登录(Single Sign On) .
第三部分 实现单点登录(Single Sign On) "等了好久终于等到今天,写了好久终于就快完结,但是网友的反应却让我有一些的伤心.盼了好久终于盼到今天,忍了好久终于把此文撰写,那些受冷 ...
- Scott的ASP.net MVC框架系列文章之四:处理表单数据(2)
前几周我发表了一系列文章介绍我们正在研究的ASP.NET MVC框架.ASP.NET MVC框架为你提供了一种新的开发Web应用程序的途径,这种途径可以让应用程序变得更加层次清晰,而且更加有利于对代码 ...
最新文章
- Vue API(directives) 自定义指令
- manjaro 火焰截图添加快捷键_Linux中功能强大的截图工具 - Flameshot
- java 基本类型内存_java基本数据类型、内存分析、装包拆包
- JDK之ConcurrentHashMap
- java图像识别算法_图像算法原理与实践——绪论
- WIN7+wampserver2.4+zend stadio10.6.1配置Xdebug
- linux内存占用过高原因
- anaconda的执行路径
- API的非向后兼容性无论如何通常代表着一种比较差的设计
- VB.NET判断一个路径的文件是否存在
- MIPS指令:常用R型、I型、J型指令编解码表
- 使用Timer的缺陷
- 触发器如何通知websocket_「Web应用架构」如何扩展WebSockets
- 可展开的UITableViewCell
- 编译android4.4 报错error: call to '__property_get_too_small_error' declared with attribute 的处理 (转载)...
- 阶段1 语言基础+高级_1-3-Java语言高级_08-JDK8新特性_第1节 常用函数接口_6_函数式接口作为方法的返回值类...
- 推流式搅拌器选型功率计算方法_QSJ-1000
- 联想服务器的主板型号怎么看,科技知识:联想主板型号怎么看
- BZOJ3034: Heaven Cow与God Bull
- QT不规则窗口的移动原理和证明/QT窗口背景透明(附代码实现)
热门文章
- js怎样和硬件交互_Node.js与JavaScript
- Iar环境c语言调用汇编函数,如何在IAR EWARM中通过内联汇编程序在另一个模块中调用C函数?...
- android读取工程目录下的文件,Android编程实现读取工程中的txt文件功能
- Open3D DbScanClustering聚类算法
- 和12岁小同志搞创客开发:如何使用继电器?
- 优达学城《DeepLearning》大纲和学习愿景
- keras 的 example 文件 class_activation_maps.py 解析
- 利用最小二乘法求解仿射变换参数
- webstorm命令行提示‘node‘ 或‘npm‘不是内部或外部命令,也不是可运行的程序
- Maya制作风格化的女性跑步动画学习教程