All articles| All Pictures| All Softwares| All Video| Go home page| Write articles| Upload pictures

Reading number is top 10 articles
实例学习PHP程序对用户身份认证实现两种方法_php资料_编程技术
visual c++中CColorDialog对话框的制作
SQLServer2005数据库还原到SQLServer2000_[SQL Server教程]
asp.net使用存储过程实现用户登录_[Asp.Net教程]
谈SQL Server 2005中的T-SQL增强_[SQL Server教程]
delphi弹出菜单组件(TPopMenu)
XML入门教程-服务器上的XML_[XML教程]
XSL教程:了解基础知识关于XSL_[XML教程]
PHP+Ajax 实现分页技术_[PHP教程]
几秒后自动跳转页面代码_[Html教程]
Reading number is top 10 pictures
From China fortress sora aoi1
Sora aoi in China2
The real super beauty5
Park waits to have her picture taken exposed
Japan sexy beauty passion photo
Average female college students1
Angie Chiu vijara myth2
刘亦菲写真集2
A man's favorite things4
福利是必须的
Download software ranking
White deer villiage
Unix video tutorial11
Ashlynn Video1
Dance with duck(male prostitution)
Tram sex maniac 2 (H) rar bag4
Such love down(擒爱记)
Unix video tutorial2
Call Of Duty2
Boxer vs Yellow4
Proficient in Eclipse
归海一刀 published in(发表于) 2014/1/30 1:07:47 Edit(编辑)
使用Forms,Authentication实现用户注册、登录,(二)用户注册与登录_[Asp.Net教程]

使用Forms,Authentication实现用户注册、登录,(二)用户注册与登录_[Asp.Net教程]

使用Forms Authentication实现用户注册、登录 (二)用户注册与登录_[Asp.Net教程]

  从这一部分开始,我们将通过一个实际的完整示例来看一下如何实现用户注册与登录。在介绍注册与登录之前,我们首先介绍一下如何判断用户是否已登录,并未后面的示例编写一些基础代码。
判断用户是否已经登录
  首先,在Web站点项目中添加一个MasterPage,例如MasterPage.master。在这个母版页的ContentPlaceHolder控件之前、标签之内插入如下代码:



onClick="btnLogin_Click"> |



欢迎您,
[ onclick="btnLogout_Click">]


|


  这里提供了三个Panel控件——pnlAnonymous、pnlLoggedin和pnlNavigate。pnlAnonymous用于在用户未登录时显示“登录”和“注册”链接;pnlLoggedin用于在用户已登录时显示用户信息(如用户名和到用户个人信息页的链接等,这里仅显示用户名),以及一个“注销”按钮;pnlNavigate在任何时候都显示,是站点的导航栏。
  现在我们要实现的是,判断用户是否登录,并显示pnlAnonymous和pnlLoggedin二者之一。这里,如果是使用ASP.NET 2.0 Membership,则可以方便地使用LoginView、LoginName和LoginStatus等控件实现这些功能;然而我们不得不为此忍受Membership所带来的庞大而繁多的数据库对象,或者花更多时间去编写自定义的MembershipPorvider。
  这一系列的第一部分曾介绍过,如果用户已经登录,则可以从HttpContext.User.Identity.Name得到已登录用户的标识(通常是用户名)。然而,如果用户未登录,这个值则为空字符串。因此,通过判断该值是否为空字符串,即可的值用户是否已登录。
  由此,我们在MasterPage的后台代码中添加Page_Init方法,在页面初始化时判断用户是否登录,并显示对应的Panel控件;此外,在用户已登录时,在pnlLoggedin中的欢迎语里插入已登录用户的用户名。


protected void Page_Init(object sender, EventArgs e)
{
// 判断用户是否已登录。
if(HttpContext.Current.User.Identity.Name == "")
{
// 用户未登录。
pnlAnonymous.Visible = true;
pnlLoggedin.Visible = false;
}
else
{
// 用户已登录。
pnlAnonymous.Visible = false;
pnlLoggedin.Visible = true;


lblUserName.Text = HttpContext.Current.User.Identity.Name;
}
}


  此外,我们还向项目中添加了default.aspx、login.aspx、register.aspx、test.aspx这样四个页面。其中test.aspx用于检验重定向到登录页后的ReturnUrl参数值,和登录后回到之前页面的效果。


用户注册
  用户注册部分并不属于验证的范畴,因此Forms Authentication也没有提供过多的支持。然而用户注册是比较简单的,只需通过一个页面搜集用户信息,并存放到数据库中即可。在这个示例中,为了方便和突出真正要讨论的内容,用户信息并不是真的放到数据库中的,而是放在一个集合里,不过通过一个DataAccess类来隐藏这种差异。理论上,一旦关闭应用程序并重新开启,放在集合中的数据就会丢失。然而实际上,再重复运行这里的示例时,用户数据并不会丢失,即便应用程序有所改动也是。这是因为ASP.NET 2.0对于Web项目都是动态重新编译的,应用程序从未直接终止过。
  此外,就用户的数据实体类而言,我们仅提供了注册、登录所必需的属性——用户名、密码散列值、密码Salt值。(关于密码的加Salt值散列,请参见之前的一篇短文。)
  为了进行用户注册,我们建立了register.aspx页面,该页面仅负责搜集用户信息,真正的创建用户动作在App_Code下的Membership类中完成。注意,此Membership非彼Membership,与ASP.NET 2.0 Membership没有任何关系。
  首先在Membership类中添加一个静态方法CreateUser,用于创建用户。该方法完成用户实体的创建和密码的散列等功能。其代码如下所示:


public static void CreateUser(string userName, string password)
{
UserObject user = new UserObject();
user.Name = userName;
user.PasswordSalt = GenerateSalt();
user.PasswordHash = EncodePassword(password, user.PasswordSalt);


DataAccess.AddUser(user);
}


  这段代码非常简单,其中用到了GenerateSalt和EncodePassword方法,这两个方法用于完成salt值的生成和密码的加salt散列。其代码抽取自MembershipProvider类,进行了精简如下所示:


public const string PasswordHashAlgorithmName = "SHA1";


static string EncodePassword(string password, string salt)
{
byte[] src = Encoding.Unicode.GetBytes(password);
byte[] saltbuf = Convert.FromBase64String(salt);
byte[] dst = new byte[saltbuf.Length + src.Length];
byte[] inArray = null;
Buffer.BlockCopy(saltbuf, 0, dst, 0, saltbuf.Length);
Buffer.BlockCopy(src, 0, dst, saltbuf.Length, src.Length);


HashAlgorithm algorithm = HashAlgorithm.Create(PasswordHashAlgorithmName);
inArray = algorithm.ComputeHash(dst);


return Convert.ToBase64String(inArray);
}


static string GenerateSalt()
{
byte[] data = new byte[0x10];
new RNGCryptoServiceProvider().GetBytes(data);
return Convert.ToBase64String(data);
}


  然后在register.aspx页面中创建搜集用户信息的表单,这个表单非常简单,仅需在ContentPlaceHolder1内添加如下代码:





用户名:



密码:



onclick="btnOK_Click" />




  注意这比实际的注册页要简单许多,没有对用户名和密码的格式做验证,也没有让用户重复输入密码以确保没有键入错误。但Anders Liu相信,对于聪明的读者而言这些都不是问题,所以不再赘述。
  在“确定”按钮的事件处理器中添加如下代码,完成注册功能:


protected void btnOK_Click(object sender, EventArgs e)
{
try
{
Membership.CreateUser(txtUserName.Text, txtPassword.Text);


lblMessage.Text = "用户创建成功!";
}
catch(Exception ex)
{
lblMessage.Text = "错误:" + ex.Message;
}
}


用户登录
  用户登录大致由下面几个步骤完成:
根据用户名取得与用户相关的信息(用户实体对象);
判断用户密码是否正确;
设置用户凭据Cookie并重定向到登录前页面。
  我们主要还是在Membership类中来完成这些工作。为Membership类添加一个Login方法:


public static void Login(string userName, string password, bool rememberMe)
{
// 获取用户。
UserObject user = DataAccess.GetUserByName(userName);
if(user == null)
throw new ArgumentException("用户不存在!", "UserName");


// 检查密码是否正确。
string pwdHash = EncodePassword(password, user.PasswordSalt);
if(pwdHash != user.PasswordHash)
throw new ArgumentException("密码错误!", "Password");


// 设置安全Cookie并进行重定向。
FormsAuthentication.RedirectFromLoginPage(userName, rememberMe);
}


  这里重点在于检查密码,不过其工作方式已经在上一篇文章中介绍过了,此处不再赘述。读者应该注意到,对密码进行散列使用的是已经存放在数据实体中的Salt值,而不是重新生成Salt值。
  这段示例代码通过抛异常来返回错误信息。读者在实际编写这个方法时,可以创建多个Exception类的派生类,分别表示不同的错误;或者采取其他无需抛异常的方式。这一点仁者见仁,智者见智。
  接下来,提供一个简单的登录页,完成收集用户名和密码的工作。login.aspx页面的结构也很简单,只需在中添加下列代码:





用户名:



密码:




onclick="btnLogin_Click" />






  最后,在“登录”按钮的事件处理器中添加如下代码,调用刚刚写好的Membership.Login方法,完成登录。


protected void btnLogin_Click(object sender, EventArgs e)
{
try
{
Membership.Login(txtUserName.Text, txtPassword.Text, chkRememberMe.Checked);
}
catch(Exception ex)
{
lblMessage.Text = "错误:" + ex.Message;
}
}


  至此,用户登录功能就OK了。由于之前已经完成了判断用户是否登录的代码,现在就可以运行示例,注册一个用户并尝试从各个页面进入登录页进行登录了。


用户注销
  至此,我们已经为用户进入我们的系统提供了宽敞大路;但作为一个负责任的程序,我们还得确保当用户离开我们的程序时,能够“挥一挥衣袖”不留下一丝痕迹。这个安全离开的行为,我们称之为“注销”;要抹去的“痕迹”也就是登录时留下的用户凭据Cookie。
  本文的第一部分已经介绍过,FormsAuthentication.SignOut方法可以协助完成这一任务。我们在MasterPage中也预先放置好了一个“注销”链接按钮,在这里,只要为该按钮添加如下事件处理器即可:


protected void btnLogout_Click(object sender, EventArgs e)
{
FormsAuthentication.SignOut();
Response.Redirect(Request.RawUrl);
}


  在这里,首先通过调用FormsAuthentication.SignOut方法移除了用户凭证Cookie。这个方法并不能自动完成跳转,因此我么必须自己完成跳转任务。关于注销后跳转到哪个页面,每个应用程序都有自己的方式(如跳到登录页或跳到首页等),这里选择的是刷新当前页。


小结
  好了,到现在为止,完整的用户注册、登录功能就都实现了。由于有了FormsAuthentication类,这一任务已经非常简单了。这一部分仅仅是从实践的角度顺序操作了一下。
  下一部分将介绍如何将我们自己的用户实体放到HttpContext.User属性中。







添加到del.icio.us 添加到新浪ViVi 添加到百度搜藏 添加到POCO网摘 添加到天天网摘365Key 添加到和讯网摘 添加到天极网摘 添加到黑米书签 添加到QQ书签 添加到雅虎收藏 添加到奇客发现 diigo it 添加到饭否 添加到飞豆订阅 添加到抓虾收藏 添加到鲜果订阅 digg it 貼到funP 添加到有道阅读 Live Favorites 添加到Newsvine 打印本页 用Email发送本页 在Facebook上分享


Disclaimer Privacy Policy About us Site Map

If you have any requirements, please contact webmaster。(如果有什么要求,请联系站长)
Copyright ©2011-
uuhomepage.com, Inc. All rights reserved.