www.passport.com或者在MS的网站上查找相关信息。

第三种方案就是我今天要重点说明的,表单验证模式。

二、表单验证:
你可以在web.config中启动表单验证。

身份验证(表单验证),Cookies及对称加密     < authentication  mode ="Forms" >  
身份验证(表单验证),Cookies及对称加密          
< forms  loginUrl ="login.aspx"  protection ="None"  name ="WebbUser"  path ="/" />         
身份验证(表单验证),Cookies及对称加密    
</ authentication >

详细的说明可以在MSDN里查找authentication。添加完认证后,就是做一个登录页而,让用户取得认证。在DotNet下,已经很好的集成了认证票据的生成模式。认证票据其实就是一个加密了的Cookies,后面我将说明如何自己定义票据,及自己定义加密的Cookies来做自己的票据类。

当取得用户的登录名与密码后(一般是从数据库里查询并验证),如果用户是合法的,那么就应该给用户设置一个认证的票据:

身份验证(表单验证),Cookies及对称加密FormsAuthentication.RedirectFromLoginPage();

上面的方法给用户添加一个认证并返回访问的页面上去。从此,用户的机器上就多了一个Cookies了,这个Cookies就是用户认证的信息,当然它是经加密了的。这样,用户就可以访问要求身份验证的页面了,因为这时候,用户的所用访问都将带着这个Cookies来提交了。

我们可以从Form的User的实例上取得用户的验证信息,它其实是FormsIdentity的一个实例:

身份验证(表单验证),Cookies及对称加密         private   void  Page_Load( object  sender, System.EventArgs e)
身份验证(表单验证),Cookies及对称加密身份验证(表单验证),Cookies及对称加密        
身份验证(表单验证),Cookies及对称加密{
身份验证(表单验证),Cookies及对称加密            
//  Put user code to initialize the page here
身份验证(表单验证),Cookies及对称加密
            Response.Write( this .User.Identity.AuthenticationType + " <br> " );
身份验证(表单验证),Cookies及对称加密            Response.Write(
this .User.Identity.IsAuthenticated + " <br> " );
身份验证(表单验证),Cookies及对称加密            Response.Write(
this .User.Identity.Name + " <br> " );                
身份验证(表单验证),Cookies及对称加密        }

以上代码输出经过验证后的用户信息。我们可以自己返回验证的票据:

身份验证(表单验证),Cookies及对称加密         private   void  Page_Load( object  sender, System.EventArgs e)
身份验证(表单验证),Cookies及对称加密身份验证(表单验证),Cookies及对称加密        
身份验证(表单验证),Cookies及对称加密{
身份验证(表单验证),Cookies及对称加密            
//  Put user code to initialize the page here
身份验证(表单验证),Cookies及对称加密
            FormsIdentity m_identity             =   this .User.Identity  as  FormsIdentity;
身份验证(表单验证),Cookies及对称加密            FormsAuthenticationTicket m_ticket    
=  m_identity.Ticket;
身份验证(表单验证),Cookies及对称加密            Response.Write(m_ticket.CookiePath
+ " <br/> " );
身份验证(表单验证),Cookies及对称加密            Response.Write(m_ticket.Expiration.ToString()
+ " <br/> " );
身份验证(表单验证),Cookies及对称加密            Response.Write(m_ticket.Expired
+ " <br/> " );
身份验证(表单验证),Cookies及对称加密            Response.Write(m_ticket.IsPersistent
+ " <br/> " );
身份验证(表单验证),Cookies及对称加密            Response.Write(m_ticket.IssueDate
+ " <br/> " );
身份验证(表单验证),Cookies及对称加密            Response.Write(m_ticket.Name
+ " <br/> " );
身份验证(表单验证),Cookies及对称加密            Response.Write(m_ticket.UserData
+ " <br/> " );
身份验证(表单验证),Cookies及对称加密            Response.Write(m_ticket.Version
+ " <br/> " );
身份验证(表单验证),Cookies及对称加密        }

注意上面的UserData,如果你用的是FormsAuthentication.RedirectFromLoginPage();那么它是一个空的字符串。当然我们可自己定义这里面的数据,它是一个任意长度的字符串(当然,可能会受到Cookies大小的限制)。

三、自定义验证票据:

在登录页面上,我们可以自己定义一个票据,然后添加到用户的Cookies里,一样起到表单验证的效果:

身份验证(表单验证),Cookies及对称加密         public   virtual    void  Login( bool  i_autoLogin)
身份验证(表单验证),Cookies及对称加密身份验证(表单验证),Cookies及对称加密        
身份验证(表单验证),Cookies及对称加密{
身份验证(表单验证),Cookies及对称加密            
string  m_userData     =   this .m_userID.ToString() + " , " + this .m_loginName + " , " + this .m_userType.ToString();
身份验证(表单验证),Cookies及对称加密            FormsAuthenticationTicket ticket 
=   new  FormsAuthenticationTicket(
身份验证(表单验证),Cookies及对称加密                
1 ,
身份验证(表单验证),Cookies及对称加密                
" WebbUser " ,
身份验证(表单验证),Cookies及对称加密                System.DateTime.Now,
身份验证(表单验证),Cookies及对称加密                System.DateTime.Now.AddDays(
30 ),
身份验证(表单验证),Cookies及对称加密                i_autoLogin,
身份验证(表单验证),Cookies及对称加密                m_userData,
身份验证(表单验证),Cookies及对称加密                
" /WAVE/ " );
身份验证(表单验证),Cookies及对称加密            
string  encTicket  =  FormsAuthentication.Encrypt(ticket);
身份验证(表单验证),Cookies及对称加密            HttpContext.Current.Response.Cookies.Add(
new  HttpCookie( " WebbUser " , encTicket));
身份验证(表单验证),Cookies及对称加密            
//
身份验证(表单验证),Cookies及对称加密
            HttpCookie m_cookie     =   new  HttpCookie( " WebbExpires " );
身份验证(表单验证),Cookies及对称加密            m_cookie.Value        
=  m_userData;
身份验证(表单验证),Cookies及对称加密            m_cookie.Expires    
=  System.DateTime.Now.AddDays( 30 );
身份验证(表单验证),Cookies及对称加密            HttpContext.Current.Response.Cookies.Set(m_cookie);
身份验证(表单验证),Cookies及对称加密        }

这里,我给UserData添加了一个形式如:"UserID|UserName|UserType"的字符串数据!这样,我们就可以在用户通过认证后,从用户的Identity票据里取得这些信息,当然再加工一下就可以成为有用的信息了。这里的string encTicket = FormsAuthentication.Encrypt(ticket);是一个加密过程,当然如果你省掉,那么系统在取加数据时就会出错,因为取回数据时,用到了Decrypt来解密,如果你没有加密,那当然在解密的时候就会出错。

如果自己定义一个Ticket,那么同样的,在用户的机器上也会多了一个Cookies,有兴趣的可以自己用Trace来看一下添加的Cookies,它是一个不等长的加密字符串,但名字是上面我们定义的。

四、自己用Cookies进行验证:
这是一个很灵活的方法,当然,一般没有必要这样进行验证。方法与ASP里用Session的验证差不多,但我们可以创建一个持久的Cookies来进行验证用及角色。
首先还在登录页面上用于添加一个用户认证的Cookies:

身份验证(表单验证),Cookies及对称加密         public   virtual    void  Login( long  i_days)
身份验证(表单验证),Cookies及对称加密身份验证(表单验证),Cookies及对称加密        
身份验证(表单验证),Cookies及对称加密{            
身份验证(表单验证),Cookies及对称加密            HttpCookie m_cookie    
=   new  HttpCookie( " WebbUser " );
身份验证(表单验证),Cookies及对称加密            
string  m_value         =   this .m_loginName + " | " + this .m_userID.ToString() + " | " + this .m_userType.ToString();
身份验证(表单验证),Cookies及对称加密
//             m_cookie.Value        = FormsAuthentication.Encrypt(m_value);
身份验证(表单验证),Cookies及对称加密
            m_cookie.Value         =  m_value;
身份验证(表单验证),Cookies及对称加密            m_cookie.Expires    
=  DateTime.Now.AddDays(i_days);
身份验证(表单验证),Cookies及对称加密            HttpContext.Current.Response.Cookies.Add(m_cookie);
身份验证(表单验证),Cookies及对称加密        }

这样看上去更简单,而且我们可以自己对这样的数据进行管理。例如,先做一个所有Form的BasePage,它实现一个WebUser或者WebVisitor类,并为设定为只读属性或者公有成员。在页面初始化的时候,就先读取数据:

身份验证(表单验证),Cookies及对称加密         public   void  LoadDataFromCookies()
身份验证(表单验证),Cookies及对称加密身份验证(表单验证),Cookies及对称加密        
身份验证(表单验证),Cookies及对称加密{
身份验证(表单验证),Cookies及对称加密            HttpCookie m_cookies    
=  HttpContext.Current.Request.Cookies[ " WebbUser " ];
身份验证(表单验证),Cookies及对称加密            
if (m_cookies == null ) return ;
身份验证(表单验证),Cookies及对称加密            
string [] m_data             =  m_cookies.Value.Split( ' | ' );
身份验证(表单验证),Cookies及对称加密            
if (m_data.Length < 3 ) return ;
身份验证(表单验证),Cookies及对称加密            
this .m_loginName         =  m_data[ 0 ];
身份验证(表单验证),Cookies及对称加密            
this .m_userID             =  Convert.ToInt64(m_data[ 1 ]);
身份验证(表单验证),Cookies及对称加密            
this .m_userType             =  WebbUser.ConvertStringToUserTypes(m_data[ 2 ]);
身份验证(表单验证),Cookies及对称加密        }

当然,这个User类(我们自己定义的,不是Form里的User)是有默认数据,也就是没有认证时候的信息。

之后,我们就可以在所有的子类页面上随时对用户进行认证:

身份验证(表单验证),Cookies及对称加密         private   void  Page_Load( object  sender, System.EventArgs e)
身份验证(表单验证),Cookies及对称加密身份验证(表单验证),Cookies及对称加密        
身份验证(表单验证),Cookies及对称加密{
身份验证(表单验证),Cookies及对称加密            
//  Put user code to initialize the page here
身份验证(表单验证),Cookies及对称加密
             this .CheckVisitorType(Webb.Web.BasePage.WebbUser.UserTypes.Admin);
身份验证(表单验证),Cookies及对称加密            Response.Write(
this .WebbVisitor.UserType);
身份验证(表单验证),Cookies及对称加密            Response.Write(
this .WebbVisitor.UserID);
身份验证(表单验证),Cookies及对称加密            Response.Write(
this .WebbVisitor.LoninName);
身份验证(表单验证),Cookies及对称加密        }

当然,上面的CheckVisitorType是自己定义的了。这样,不仅可以完成对用户的认证,还可以对用户的角色进行十分灵活的设置,如果再进一步的细化User类(因为有ID,所以可以在数据库里添加很多详细的信息),就可以完全实现个性化的User了!

五、Cookies的加密:
如系统自己带的票据一样,我们也可以添加一个加密的工作。因为我们不仅要加密,而且还要解密,因此不能采用Hash加密方法(虽然这个方法很好,其中最常用的Hash128位加密,也就是MD5加密在B/S的网站上经常使用)。这里有两个方案可选:对称加密与非对称加密。非对称加密就是分开密钥,这里不作说明,有兴趣的可以参考一些公开密钥的文章,或者一些数字签名的内容。我采用了简单的对称加密对Cookies加密。
.net下有DES-United states data encryption standard,Triple Des(三次DES加密),RC2及Rijndael几种加密算法,每个算法有一个提供类来支持具体的加密与解密工作,可以对文件等进行加密。这里简单的说明介绍一下DES加密。

DES加密要事先提供一个密码:Key及一个初始向量:IV(Initial Vector)来进行初始化,而这个Key及IV都必须是8个字节的数据。
这里简单的实现了一个加密与解密:
using System;
using System.IO;
using System.Web;
using System.Security.Cryptography;
using System.Globalization;
using System.Text;
using System.ComponentModel;

身份验证(表单验证),Cookies及对称加密身份验证(表单验证),Cookies及对称加密         /**/ ///   <summary>
身份验证(表单验证),Cookies及对称加密        
///  DES encrypt.
身份验证(表单验证),Cookies及对称加密        
///   </summary>
身份验证(表单验证),Cookies及对称加密        
///   <param name="i_key"></param>
身份验证(表单验证),Cookies及对称加密        
///   <param name="i_IV"></param>
身份验证(表单验证),Cookies及对称加密        
///   <param name="i_data"></param>
身份验证(表单验证),Cookies及对称加密        
///   <returns></returns>

身份验证(表单验证),Cookies及对称加密         public   static   string  Encrypt( string  i_key, string  i_IV, string  i_data)
身份验证(表单验证),Cookies及对称加密身份验证(表单验证),Cookies及对称加密        
身份验证(表单验证),Cookies及对称加密{
身份验证(表单验证),Cookies及对称加密            
byte [] m_keys     =  Encoding.ASCII.GetBytes(i_key);
身份验证(表单验证),Cookies及对称加密            
byte [] m_IVs     =  Encoding.ASCII.GetBytes(i_IV);
身份验证(表单验证),Cookies及对称加密            
byte [] m_data     =  Encoding.ASCII.GetBytes(i_data);
身份验证(表单验证),Cookies及对称加密            DESCryptoServiceProvider m_DES    
=   new  DESCryptoServiceProvider();
身份验证(表单验证),Cookies及对称加密            ICryptoTransform m_encrypt        
=  m_DES.CreateEncryptor(m_keys,m_IVs);
身份验证(表单验证),Cookies及对称加密            
byte [] m_result     =  m_encrypt.TransformFinalBlock(m_data, 0 ,m_data.Length);
身份验证(表单验证),Cookies及对称加密            m_encrypt.Dispose();
身份验证(表单验证),Cookies及对称加密            m_DES.Clear();
身份验证(表单验证),Cookies及对称加密            
return  BitConverter.ToString(m_result);
身份验证(表单验证),Cookies及对称加密        }

身份验证(表单验证),Cookies及对称加密
身份验证(表单验证),Cookies及对称加密身份验证(表单验证),Cookies及对称加密        
/**/ ///   <summary>
身份验证(表单验证),Cookies及对称加密        
///  DES descrypt.
身份验证(表单验证),Cookies及对称加密        
///   </summary>
身份验证(表单验证),Cookies及对称加密        
///   <param name="i_key"> Keys </param>
身份验证(表单验证),Cookies及对称加密        
///   <param name="i_IV"> initial vector </param>
身份验证(表单验证),Cookies及对称加密        
///   <param name="i_data"> Data </param>
身份验证(表单验证),Cookies及对称加密        
///   <returns></returns>

身份验证(表单验证),Cookies及对称加密         public   static   string  Decrypt( string  i_key, string  i_IV, string  i_data)
身份验证(表单验证),Cookies及对称加密身份验证(表单验证),Cookies及对称加密        
身份验证(表单验证),Cookies及对称加密{
身份验证(表单验证),Cookies及对称加密            
string [] m_datas     =  i_data.Split( ' - ' );
身份验证(表单验证),Cookies及对称加密            
byte [] m_values         =   new   byte [m_datas.Length];
身份验证(表单验证),Cookies及对称加密            Int32Converter m_i32Converter    
=   new  Int32Converter();
身份验证(表单验证),Cookies及对称加密            
for ( int  i = 0 ;i < m_datas.Length;i ++ )
身份验证(表单验证),Cookies及对称加密身份验证(表单验证),Cookies及对称加密            
身份验证(表单验证),Cookies及对称加密{
身份验证(表单验证),Cookies及对称加密                m_values[i]        
=  Convert.ToByte(m_i32Converter.ConvertFromInvariantString( " 0x " + m_datas[i]).ToString());
身份验证(表单验证),Cookies及对称加密            }

身份验证(表单验证),Cookies及对称加密            
byte [] m_keys     =  Encoding.ASCII.GetBytes(i_key);
身份验证(表单验证),Cookies及对称加密            
byte [] m_IVs     =  Encoding.ASCII.GetBytes(i_IV);
身份验证(表单验证),Cookies及对称加密            
byte [] m_data     =  Encoding.ASCII.GetBytes(i_data);
身份验证(表单验证),Cookies及对称加密            DESCryptoServiceProvider m_DES    
=   new  DESCryptoServiceProvider();
身份验证(表单验证),Cookies及对称加密            ICryptoTransform m_encrypt        
=  m_DES.CreateDecryptor(m_keys,m_IVs);
身份验证(表单验证),Cookies及对称加密            
byte [] m_result     =  m_encrypt.TransformFinalBlock(m_values, 0 ,m_values.Length);
身份验证(表单验证),Cookies及对称加密            
return  Encoding.ASCII.GetString(m_result);            
身份验证(表单验证),Cookies及对称加密        }

注意:1、这里的i_key及i_IV都必须是8个字节的,也就是说必须是ASCII的8个字符串,否则在加密及解密中会抛出异常!有了这个加密与解密后,我们就可以对自己定义的Cookies进行加密,然保存在用户的机器上了。
2、这里的Key与IV不仅是初始化算法所必须的,也是解密时所必须的。

六、加密数据溢出问题:
上面已经强调了很多次,KEY及IV都必须是8个字节的,否则出现错误。这对于程序员来说很好理解,但对于用户来说,可就不是什么好事了。如果用少于或者多于8个字节的KEY或者IV来调用加密或者解密函数,都将出现错误。这个可以由程序员来决定,或者将KEY及IV事先就选择好,也就不会有问题了。注意加密与解密所选择的Encoding字符集,不同的字符集得到的结果是不样的。

七、附加MD5密码函数:

身份验证(表单验证),Cookies及对称加密身份验证(表单验证),Cookies及对称加密         /**/ ///   <summary>
身份验证(表单验证),Cookies及对称加密        
///  
身份验证(表单验证),Cookies及对称加密        
///   </summary>
身份验证(表单验证),Cookies及对称加密        
///   <param name="str_inString"></param>
身份验证(表单验证),Cookies及对称加密        
///   <returns></returns>

身份验证(表单验证),Cookies及对称加密         static   public   string  GetMD5( string  i_data)
身份验证(表单验证),Cookies及对称加密身份验证(表单验证),Cookies及对称加密        
身份验证(表单验证),Cookies及对称加密{
身份验证(表单验证),Cookies及对称加密            
byte [] m_datas     =  Encoding.ASCII.GetBytes(i_data);
身份验证(表单验证),Cookies及对称加密            MD5CryptoServiceProvider m_MD5 
=   new  MD5CryptoServiceProvider();
身份验证(表单验证),Cookies及对称加密            
byte [] m_value     =  m_MD5.ComputeHash(m_datas);
身份验证(表单验证),Cookies及对称加密            
return  BitConverter.ToString(m_value);
身份验证(表单验证),Cookies及对称加密        }

总结:其实.net下的表单验证就是一个Cookies,我们不仅可以自己定义验证票据,而且还可以自己模拟验证模式来自己添加Cookies来更加灵活的进行用户身份验证及角色处理。

相关文章:

  • 2021-08-23
  • 2022-12-23
  • 2021-08-03
猜你喜欢
  • 2021-07-23
  • 2022-12-23
  • 2022-12-23
  • 2021-11-16
  • 2022-12-23
  • 2021-11-14
相关资源
相似解决方案