ASPNET(基于C#)指导案例注册及登录验证模块设计_第1页
ASPNET(基于C#)指导案例注册及登录验证模块设计_第2页
ASPNET(基于C#)指导案例注册及登录验证模块设计_第3页
ASPNET(基于C#)指导案例注册及登录验证模块设计_第4页
ASPNET(基于C#)指导案例注册及登录验证模块设计_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

ASP.NET案例操作注册及登录验证模块设计用户登录及管理是任何功能网站应用程序中都不可缺少的一个功能,是系统平安性的第一个环节。本例子详细说明如何制作网站的注册及登录验证模块。实例实现具体功能说明:用户登录;用户注册;修改用户根本信息;修改用户密码;删除用户;设置用户权限;验证码进行用户验证;退出登录。技术要点实现用户登录及用户管理时还应该防止用户进行恶意攻击等平安问题,为了进一步保证网站的平安,还需要使用一些辅助手段,如加密等。防止SQL注入式攻击,可以采用以下几种方法。使用存储过程传参的方式操作数据库;对用户通过网址提交的变量进行参数检查,对一些危险字符进行警告或其他处理;对用户密码进行加密。本章采用该方法。功能设计在站点中添加几个动态页面,功能如下:Login.aspx页面:登录主页面Register.aspx页面:注册页面UserManagement.aspx页面:用户管理页面。修改用户根本信息;修改用户密码;删除用户;设置用户权限;ValidateNum.aspx页面:产生随机数图片DB.cs文件:数据库操作类,封装数据库操作的类文件数据库设计新建一pub数据库,在pub数据库中间建立一个User表,UserID设为关键字,并且设置为标识符,自动从1开始,增量为1,默认注册时role值为false。在该表内添加一条数据〔系统管理员〕,用户名:xx,密码(实际为1234,这个是加密码):81dc9bdb52d04dc20036dbd8313ed0,角色:true警告:user是sql关键字,所以在写sql语句时候,user表应加[]建立数据库连接使用sqldatasource数据源控件配置数据库的连接字符串,写到web.config文件中。格式如下:

<addname="pub"connectionString="DataSource=.;InitialCatalog=pub;PersistSecurityInfo=True;UserID=sa;Password=1234"providerName="System.Data.SqlClient"/>设计数据库操作类DB.cs设计一个数据库操作类,用以操作数据库。步骤:选中网站文件夹,添加新项,添加类,并命名为DB.cs,该类已经添加了常用的命名空间,还有默认的构造函数。需添加代码如下(红色显示):usingSystem;usingSystem.Data;usingSystem.Configuration;usingSystem.Web;usingSystem.Web.Security;usingSystem.Web.UI;usingSystem.Web.UI.WebControls;usingSystem.Web.UI.WebControls.WebParts;usingSystem.Web.UI.HtmlControls;usingSystem.Data.SqlClient;//数据库操作需引入的命名空间usingSystem.Security.Cryptography;//MD5加密需引入的命名空间///<summary>///DB的摘要说明///</summary>publicclassDB{ publicDB() { // //TODO:在此处添加构造函数逻辑

// }

///<summary>///连接数据库

///</summary>///<returns>返回SqlConnection对象</returns>publicSqlConnectionGetCon(){

returnnewSqlConnection(ConfigurationManager.ConnectionStrings["pub"].ConnectionString);}}///<summary>///执行SQL语句///</summary>///<paramname="cmdstr">SQL语句</param>///<returns>返回值为int型:成功返1,失败返回0</returns>publicintsqlEx(stringcmdstr){SqlConnectioncon=GetCon();//连接数据库con.Open();//翻开连接SqlCommandcmd=newSqlCommand(cmdstr,con);try{cmd.ExecuteNonQuery();//执行SQL语句并返回受影响的行数return1;//成功返回1}catch(Exceptione){return0;//失败返回0}finally{con.Dispose();//释放连接对象资源}}

///<summary>///执行SQL查询语句

///</summary>///<paramname="cmdstr">查询语句</param>///<returns>返回DataTable数据表</returns>publicDataTablereDt(stringcmdstr){SqlConnectioncon=GetCon();SqlDataAdapterda=newSqlDataAdapter(cmdstr,con);DataSetds=newDataSet();da.Fill(ds);return(ds.Tables[0]);}///<summary>///执行SQL查询语句///</summary>///<paramname="str">查询语句</param>///<returns>返回SqlDataReader对象dr</returns>publicSqlDataReaderreDr(stringstr){SqlConnectionconn=GetCon();//连接数据库conn.Open();//并翻开了连接SqlCommandcom=newSqlCommand(str,conn);SqlDataReaderdr=com.ExecuteReader(CommandBehavior.CloseConnection);returndr;//返回SqlDataReader对象dr}///<summary>///MD5加密

///</summary>///<paramname="strPwd">被加密的字符串</param>///<returns>返回加密后的字符串</returns>publicstringMD5(stringstrPwd){MD5md5=newMD5CryptoServiceProvider();byte[]data=System.Text.Encoding.Default.GetBytes(strPwd);//将字符编码为一个字节序列

byte[]md5data=md5.ComputeHash(data);//计算data字节数组的哈希值

md5.Clear();stringstr="";for(inti=0;i<md5data.Length-1;i++){str+=md5data[i].ToString("x").PadLeft(2,'0');}returnstr;}}//加密操作Login.aspx页面设计界面设计如下:其中imagebutton的imageurl设置为~/ValidateNum.aspx后台代码页加:usingSystem.Data.SqlClient;登录按钮代码如下:

//实例化公共类对象

DBdb=newDB();stringuserName=TextBox1.Text.Trim();stringpassWord=db.MD5(TextBox2.Text.Trim());//对密码进行加密处理

stringnum=TextBox3.Text.Trim();if(Session["ValidateNum"].ToString()==num.ToUpper()){//获取用户信息

SqlDataReaderdr=db.reDr("select*from[User]whereUserName='"+userName+"'andPassWord='"+passWord+"'");dr.Read();if(dr.HasRows)//通过dr中是否包含行判断用户是否通过身份验证

{Session["UserID"]=dr.GetValue(0);//将该用户的ID存入Session["UserID"]中

Session["Role"]=dr.GetValue(4);//将该用户的权限存入Session["Role"]中

Response.Redirect("~/UserManagement.aspx");//跳转到主页

}else{Response.Write("<script>alert('登录失败!请返回查找原因');location='Login.aspx'</script>");}dr.Close();}else{Response.Write("<script>alert('验证码输入错误!');location='Login.aspx'</script>");}注册按钮代码如下:

Response.Redirect("~/Register.aspx");//跳转到用户注册页面也可以直接设置该按钮的postbackurl属性ValidateNum.aspx页面设计本页面为纯后台操作,界面不需要任何设计。参加命名空间:usingSystem.Drawing;protectedvoidPage_Load(objectsender,EventArgse){if(!IsPostBack){stringvalidateNum=CreateRandomNum(4);//成生4位随机字符串CreateImage(validateNum);//将生成的随机字符串绘成图片Session["ValidateNum"]=validateNum;//保存验证码}}//生成随机字符串privatestringCreateRandomNum(intNumCount){stringallChar="0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,W,X,Y,Z";string[]allCharArray=allChar.Split(',');//拆分成数组stringrandomNum="";inttemp=-1;//记录上次随机数的数值,尽量防止产生几个相同的随机数Randomrand=newRandom();for(inti=0;i<NumCount;i++){if(temp!=-1){rand=newRandom(i*temp*((int)DateTime.Now.Ticks));}intt=rand.Next(35);if(temp==t){returnCreateRandomNum(NumCount);}temp=t;randomNum+=allCharArray[t];}returnrandomNum;}//生成图片

privatevoidCreateImage(stringvalidateNum){if(validateNum==null||validateNum.Trim()==String.Empty)return;//生成Bitmap图像

System.Drawing.Bitmapimage=newSystem.Drawing.Bitmap(validateNum.Length*12+10,22);Graphicsg=Graphics.FromImage(image);try{//生成随机生成器

Randomrandom=newRandom();//清空图片背景色

g.Clear(Color.White);//画图片的背景噪音线

for(inti=0;i<25;i++){intx1=random.Next(image.Width);intx2=random.Next(image.Width);inty1=random.Next(image.Height);inty2=random.Next(image.Height);g.DrawLine(newPen(Color.Silver),x1,y1,x2,y2);}

Fontfont=newSystem.Drawing.Font("Arial",12,(System.Drawing.FontStyle.Bold|System.Drawing.FontStyle.Italic));System.Drawing.Drawing2D.LinearGradientBrushbrush=newSystem.Drawing.Drawing2D.LinearGradientBrush(newRectangle(0,0,image.Width,image.Height),Color.Blue,Color.DarkRed,1.2f,true);g.DrawString(validateNum,font,brush,2,2);//画图片的前景噪音点

for(inti=0;i<100;i++){intx=random.Next(image.Width);inty=random.Next(image.Height);image.SetPixel(x,y,Color.FromArgb(random.Next()));}//画图片的边框线

g.DrawRectangle(newPen(Color.Silver),0,0,image.Width-1,image.Height-1);System.IO.MemoryStreamms=newSystem.IO.MemoryStream();//将图像保存到指定的流

image.Save(ms,System.Drawing.Imaging.ImageFormat.Gif);Response.ClearContent();Response.ContentType="image/Gif";Response.BinaryWrite(ms.ToArray());}finally{g.Dispose();image.Dispose();}}Register.aspx页面设计使用三个验证控件验证输入,设计三个按钮,一个linkbutton按钮,一个注册按钮,一个返回按钮,该返回按钮的causesvalidation属性设置为false,好处是点击返回按钮是不用再验证控件验证textbox后台代码设计参加命名空间:usingSystem.Data.SqlClient;在后台类中参加全局变量intreValue;//用于保存返回值。返回值为-1〔用户名存在〕,0〔失败〕,1〔成功〕,2〔用户名不存在〕返回按钮代码:Response.Redirect("~/Login.aspx");Linkbutton按钮代码:

//查找用户名是否存在,已经存在返回-1,不存在返回2reValue=CheckName();if(reValue==-1){Response.Write("<script>alert('用户名存在!');</script>");TextBox1.Focus();}elseif(reValue==2){Response.Write("<script>alert('恭喜您!该用户名尚未注册!');</script>");TextBox1.Focus();}//需添加CheckName()函数//验证用户名是否存在

publicintCheckName(){//实例化公共类对象

DBdb=newDB();stringstr="selectcount(*)from[User]whereUserName='"+TextBox1.Text+"'";try{DataTabledt=db.reDt(str);if(dt.Rows[0][0].ToString()!="0"){return-1;//该用户名已经存在

}else{return2;//该用户名尚未注册

}}catch(Exceptionee){return0;}}CheckName()函数注册函数代码:

reValue=CheckName();if(reValue==-1){Response.Write("<script>alert('用户名存在!');</script>");}else{DBdb=newDB();stringUserName=TextBox1.Text;stringPassWord=db.MD5(TextBox2.Text.ToString());//MD5加密

stringEmail=TextBox4.Text;stringcmdstr="insertinto[User](UserName,PassWord,Email,Role)values('"+UserName+"','"+PassWord+"','"+Email+"','false')";try{reValue=db.sqlEx(cmdstr);if(reValue==1){Response.Write("<script>alert('注册成功!');</script>");Clear();//清空文本框,后面加clear函数

}elseif(reValue==0){Response.Write("<script>alert('注册失败!');</script>");}}catch(Exceptionee){Response.Write("<script>alert('注册失败!');</script>");}}Clear函数//清空文本框

publicvoidClear(){TextBox1.Text="";TextBox2.Text="";TextBox3.Text="";TextBox4.Text="";}

UserManagement.aspx页面设计该页面使用了一个datalist控件,该控件可以可视化编辑界面编辑模板。选项如下:在UserManagement.aspx页面上放置一个linkbutton控件,causesvalidation属性设置为false,作用为退出,退出到起始页面,该按钮控件代码如下:

//清空Session中的内容,并停止SessionSession["ValidateNum"]=null;Session["Role"]=null;Session["UserID"]=null;Session.Clear();Session.Abandon();//跳转到登录页

Response.Redirect("~/Login.aspx");用户管理在页面上放置一个datalist控件,编辑它的itemtemplate模板,该模板作为首选显示选项,主要显示用户信息,如果是管理员登陆的话,显示所有注册用户和管理员信息,管理员可以删除其他用户ID,可以给其他用户升级为管理员用户权限操作。如果是普通注册用户登录,那么只能够显示自己的用户信息,用户可以做的事情是可以修改自己的注册信息。比方密码邮箱。该datalist控件源代码如下:<asp:DataListID="DataList1"runat="server"CellPadding="4"ForeColor="#333333"OnEditCommand="DataList1_EditCommand"OnCancelCommand="DataList1_CancelCommand"OnUpdateCommand="DataList1_UpdateCommand"OnDeleteCommand="DataList1_DeleteCommand"OnItemCommand="DataList1_ItemCommand"OnItemDataBound="DataList1_ItemDataBound"Font-Size="9pt"><FooterStyleBackColor="#5D7B9D"Font-Bold="True"ForeColor="White"/><SelectedItemStyleBackColor="#E2DED6"Font-Bold="True"ForeColor="#333333"/><ItemTemplate><tablestyle="width:470px;font-size:9pt;"><tr><tdstyle="width:47px;height:26px;"><asp:LinkButtonID="lnkbtnUserName"runat="server"CommandName="select"Text='<%#DataBinder.Eval(Container.DataItem,"UserName")%>'></asp:LinkButton></td><tdstyle="width:74px;height:26px;"><asp:LabelID="Label2"runat="server"Text='<%#DataBinder.Eval(Container.DataItem,"Email")%>'></asp:Label></td><tdstyle="width:81px;height:26px;"><asp:CheckBoxID="chkRole"Checked='<%#DataBinder.Eval(Container.DataItem,"Role")%>'runat="server"Enabled="False"/></td><tdstyle="width:90px;height:26px;"><asp:ButtonID="btnEdit"runat="server"CommandName="edit"Text="编辑"/><asp:ButtonID="btnDelete"runat="server"CommandName="delete"Text="删除"CommandArgument='<%#DataBinder.Eval(Container.DataItem,"UserID")%>'OnLoad="btnDelete_Load"/></td><tdstyle="width:86px;height:26px;"><asp:ButtonID="btnSetRole"runat="server"CommandName="setRole"Text='<%#(bool)DataBinder.Eval(Container.DataItem,"Role")==true?"取消管理员权限":"设为管理员权限"%>'CommandArgument='<%#DataBinder.Eval(Container.DataItem,"UserID")%>'/></td></tr></table></ItemTemplate><EditItemTemplate><tablestyle="width:297px;height:59px;font-size:9pt;"><tr><tdstyle="width:75px;height:19px;">

用户名:</td><tdstyle="width:131px;height:19px;"><asp:LabelID="lblUserName"runat="server"Text='<%#DataBinder.Eval(Container.DataItem,"UserName")%>'></asp:Label></td><tdstyle="width:95px;height:19px;"></td></tr><tr><tdstyle="width:75px">

旧密码:</td><tdstyle="width:131px"><asp:TextBoxID="txtOldpwd"runat="server"TextMode="Password"Width="98px"></asp:TextBox><asp:RequiredFieldValidatorID="RequiredFieldValidator1"runat="server"ControlToValidate="txtOldpwd"ErrorMessage="*"></asp:RequiredFieldValidator></td><tdstyle="width:95px"></td></tr><tr><tdstyle="width:75px">

新密码:</td><tdstyle="width:131px"><asp:TextBoxID="txtNewpwd"runat="server"TextMode="Password"Width="98px"></asp:TextBox><asp:RequiredFieldValidatorID="RequiredFieldValidator2"runat="server"ControlToValidate="txtNewpwd"ErrorMessage="*"></asp:RequiredFieldValidator></td><tdstyle="width:95px"></td></tr><tr><tdstyle="width:75px">

确认密码:</td><tdstyle="width:131px"><asp:TextBoxID="txtRepwd"runat="server"TextMode="Password"Width="98px"></asp:TextBox><asp:RequiredFieldValidatorID="RequiredFieldValidator3"runat="server"ControlToValidate="txtRepwd"ErrorMessage="*"></asp:RequiredFieldValidator></td><tdstyle="width:95px"><asp:CompareValidatorID="CompareValidator1"runat="server"ControlToCompare="txtNewpwd"ControlToValidate="txtRepwd"ErrorMessage="与密码不符!"Width="73px"></asp:CompareValidator></td></tr><tr><tdstyle="width:75px"></td><tdstyle="width:131px"><asp:ButtonID="btnUpdate"runat="server"CommandName="update"CommandArgument='<%#DataBinder.Eval(Container.DataItem,"PassWord")%>'Text="修改密码"/><asp:ButtonID="btnCancel"runat="server"CommandName="cancel"Text="取消"CausesValidation="False"/></td><tdstyle="width:95px"></td></tr></table></EditItemTemplate><AlternatingItemStyleBackColor="White"ForeColor="#284775"/><ItemStyleBackColor="#EBF6FD"ForeColor="#333333"/><HeaderTemplate><tablestyle="width:471px;font-size:9pt;"><tr><tdstyle="width:47px">

用户名</td><tdstyle="width:77px">

电子邮件</td><tdstyle="width:81px">

是否为管理员</td><tdstyle="width:89px;">

操作</td><tdstyle="width:89px">

管理员设置</td></tr></table></HeaderTemplate>

<HeaderStyleBackColor="#0973DC"Font-Bold="True"ForeColor="White"/><SelectedItemTemplate><tablestyle="width:297px;height:59px;font-size:9pt;"><tr><tdstyle="width:58px;height:19px;">

用户名:</td><tdstyle="width:131px;height:19px;"><asp:TextBoxID="txtUserName"runat="server"Text='<%#DataBinder.Eval(Container.DataItem,"UserName")%>'Width="98px"></asp:TextBox><asp:RequiredFieldValidatorID="RequiredFieldValidator4"runat="server"ControlToValidate="txtUserName"ErrorMessage="*"></asp:RequiredFieldValidator></td></tr><tr><tdstyle="width:58px">Email:</td><tdstyle="width:131px"><asp:TextBoxID="txtEmail"runat="server"Text='<%#DataBinder.Eval(Container.DataItem,"Email")%>'Width="98px"></asp:TextBox><asp:RequiredFieldValidatorID="RequiredFieldValidator1"runat="server"ControlToValidate="txtEmail"ErrorMessage="*"></asp:RequiredFieldValidator></td></tr><tr><tdstyle="width:58px"></td><tdstyle="width:131px"><asp:ButtonID="btnUpdateName"runat="server"CommandName="updateName"CommandArgument='<%#DataBinder.Eval(Container.DataItem,"UserID")%>'Text="修改用户信息"Width="84px"/><asp:ButtonID="btnCancel"runat="server"CommandName="cancel"Text="取消"CausesValidation="False"/></td></tr></table></SelectedItemTemplate></asp:DataList>通过对datalist的定义,该控件的事件如下:为了是用户界面更友好,操作更平安,在删除用户时候,给出提示,是否真的删除?这个可以在编辑itemtemplate模板时候,对那个删除按钮定义个load事件,该事件代码如下://删除记录前显示提示信息protectedvoidbtnDelete_Load(objectsender,EventArgse){((Button)sender).Attributes["onclick"]="javascript:returnconfirm('你确认要删除该条记录吗?')";}该按钮ID为btnDelete在该页声明公共变量,放在page_load函数前publicstaticstringselVal;//设置查询条件在该页面的page_load函数参加如下代码:if(!IsPostBack){if(Convert.ToBoolean(Session["Role"]))selVal="";else{selVal="whereUserID="+Session["UserID"].ToString();}DataListBind();}

//用于绑定DataList控件

publicvoidDataListBind(){//实例化公共类的对象

DBdb=newDB();//定义SQL语句

stringsqlstr="select*from[User]"+selVal;//实例化数据集DataTable用于存储查询结果

DataTabledt=db.reDt(sqlstr);//绑定DataList控件

DataList1.DataSource=dt;//设置数据源,用于填充控件中的项的值列表

DataList1.DataBind();//将控件及其所有子控件绑定到指定的数据源

}

//显示EditTemplate模板

protectedvoidDataList1_EditCommand(objectsource,DataListCommandEventArgse){//设置DataList1控件的编辑项的索引为选择的当前索引

DataList1.EditItemIndex=e.Item.ItemIndex;//数据绑定

DataListBind();}//取消显示EditTemplate模板

protectedvoidDataList1_CancelCommand(objectsource,DataListCommandEventArgse){//设置DataList1控件的编辑项的索引为-1,即取消编辑

DataList1.EditItemIndex=-1;//数据绑定

DataListBind();}//修改用户密码protectedvoidDataList1_UpdateCommand(objectsource,DataListCommandEventArgse){//实例化公共类的对象

DBdb=newDB();//取得文本框中输入的内容

stringuserName=((Label)e.Item.FindControl("lblUserName")).Text;stringoldpassWord=((TextBox)e.Item.FindControl("txtOldpwd")).Text;stringnewpassWord=((TextBox)e.Item.FindControl("txtNewpwd")).Text;if(db.MD5(oldpassWord)==e.CommandArgument.ToString()){stringsqlStr="update[User]setPassWord='"+db.MD5(newpassWord)+"'whereUserName='"+userName+"'";//更新数据库,变量reValue用于保存执行Sql语句的返回值,成功为1,失败为0

intreValue=db.sqlEx(sqlStr);if(reValue==0)Response.Write("<script>alert('密码修改失败!');</script>");elseResponse.Write("<script>alert('您的密码已经成功修改!');</script>");//取消编辑状态

DataList1.EditItemIndex=-1;DataListBind();}else{Response.Write("<script>alert('您输入的旧密码不正确。您的密码没有被更改。');</script>");}}

protectedvoidDataList1_ItemCommand(objectsource,DataListCommandEventArgse){//实例化公共类的对象

DBdb=newDB();//显示selectTemplate模板

if(e.CommandName=="select"){//设置选中行的索引为当前选择行的索引

DataList1.SelectedIndex=e.Item.ItemIndex;//数据绑定

DataListBind();}

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论