浅谈ASP.NET Forms验证
创始人
2024-04-25 10:01:29
0

ASP.NET Forms验证

用户验证是每一个项目必须的一个模块,由于已经很久没有碰到这一块内容,今天写一个用户验证居然脑子一片空白。于是乎就和一个同事进行了一片讨论,晚上回家决定把讨论的结果给记录下来,以备后来之需。在ASP.NET中有几种用户验证的方法:Windows验证,Forms验证和Passport验证。当然用户也可以自定义与验证方法,而最常用的莫过于Forms验证,这也是今天所要讨论的验证方式。

ASP.NET Forms验证方式首先要配置的是web.config文件,把authentication节点配置为Forms验证,而它默认的是Windows验证。再修改配置文件时,还要注意大小写,因为XML文件是大小写敏感的,修改后authentication节点如下所示,其中还包含了一些form的配置参数。

  1. <authenticationmodeauthenticationmode="Forms"> 
  2.  
  3. protection="All" 
  4. timeout="20" 
  5. name=".XDOTNET" 
  6. loginUrl="SignIn.aspx" 
  7. defaultUrl="Default.aspx" 
  8. path="/" 
  9. requireSSL="false" 
  10. enableCrossAppRedirects="false" 
  11. > 
  12.  
  13.  

关于forms节点的属性在后面介绍FormsAuthetication类的有关成员时,再介绍它们的用处。用户验证,顾名思义就是验证用户的合理性,当用户登录到网站时,验证输入的用户名和密码是否和数据库中存储的数据相符合。其实很简单,有一种快速的方法,这种验证方法很适合后台管理的验证,因为当我们关闭浏览器时验证就会失效。

  1. publicstaticboolValidUser(stringuserName,stringpassword)  
  2. {  
  3. if(!string.IsNullOrEmpty(userName)&&!string.IsNullOrEmpty(password))  
  4. {  
  5. password=FormsAuthentication.HashPasswordForStoringInConfigFile(password,"MD5");  
  6. stringrealPassword=Users.GetUser(userName).Password;  
  7. if(string.Compare(password,realPassword,true)==0)  
  8. {  
  9. FormsAuthentication.SetAuthCookie(userName,false);  
  10. returntrue;  
  11. }  
  12. }  
  13. returnfalse;  

上面的方法就可以验证以32位MD5加密的Password的数据验证,其中Users.GetUser(string)这个方法是通过用户名从数据库中取得用户实例。当用户合理时,通过FormsAuthentication.SetAuthCookie方法将为用户(以用户名)创建一个身份验证票证,并将其添加到响应的 Cookie 集合或 URL(cookieless)。这样就实现了用户验证的过程,那么我们怎么得到用户是否通过验证呢?微软把程序不断的进行封装,不断的傻瓜化,当然想得到当前用户是否通过验证也很简单,代码如下:

  1. public static bool IsAuthenticated()   
  2. {  
  3. return HttpContext.Current.User.Identity.IsAuthenticated;  


是不是很简单呢?当用户(只要后台管理验证的情况下)验证只要这两个步骤就OK了,当用户登录如调用ValidUser方法,当载入页面时通过 IsAuthenticated方法判断当前用户是否通过验证。这样一个用户验证模块也就完成了,但是在现代的网络中,用户是相当的值钱的东东,每个网站都会想留住很多的用户;有时有些东西只允许会员才能够查看等等,这样就需要更好的验证。使用户关闭浏览器后,在一段特定时间内还处于通过验证状态。这就需要操作和设置验证的票据FormsAuthenticationTicket,代码如下:

  1. public static bool ValidUser(string userName, string password)   
  2. {  
  3. if (!string.IsNullOrEmpty(userName) && !string.IsNullOrEmpty(password))   
  4. {  
  5. password = FormsAuthentication.HashPasswordForStoringInConfigFile(password, "MD5");  
  6. string realPassword = Users.GetUser(userName).Password;  
  7. if (string.Compare(password, realPassword, true) == 0)   
  8. {  
  9. FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1,  
  10. userName,  
  11. DateTime.Now,  
  12. DateTime.Now.AddMinutes(20),  
  13. false,  
  14. null//可以将Roles按","分割成字符串,写入cookie  
  15. );  
  16. string data = FormsAuthentication.Encrypt(ticket);  
  17. HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, data);  
  18. cookie.Path = FormsAuthentication.FormsCookiePath;  
  19. cookie.Domain = FormsAuthentication.CookieDomain;  
  20. cookie.Expires = ticket.Expiration;  
  21. HttpContext.Current.Response.Cookies.Add(cookie);  
  22. return true;  
  23. }  
  24. }  
  25. return false;  

从代码中看到的FormsCookiePath,CookieDomain等等就是从配置文件中获得,关于其它的FormsAuthentication成员可以访问MSDN(FormsAuthentication)。我们同样也可以通过HttpContext.Current.User对象来判断当前用户的状况,也可以用IsInRole方法来判断用户的角色。当然当我们验证用户后,要把用户加入到Http上下文HttpContext的当前请求的User对象中,代码如下:

  1. FormsIdentity identity = new FormsIdentity(ticket);  
  2. GenericPrincipal user = new GenericPrincipal(identity, new string[] { });  
  3. HttpContext.Current.User = user

这样就完成了ASP.NET Forms验证的全过程。至于查看用户的Cookie判断用户是否存在记录状态(如:记录1个月,1天,1年等等),可以在管道中进行判断和编写,这里就不再赘述。OK,由于时间的关系,就记录这些,如果有什么错误或更好的方法请大家指出,谢谢。

【编辑推荐】

  1. ASP.NET开发技巧之Theme功能浅析
  2. 详解ASP.NET动态编译
  3. Apache支持ASP.NET方法浅析
  4. 浅谈ASP.NET服务器标准控件
  5. ASP.NET中SQL Server数据库备份恢复浅析

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...
2012年第四季度互联网状况报... [[71653]]  北京时间4月25日消息,据国外媒体报道,全球知名的云平台公司Akamai Te...