form表单验证的原理

先说说Form身份验证思路:

假设用户要浏览需要权限的页面,此时,安全机制先启动,检查当前用户请求是否持有用户票据的Cookie

如此Cookie存在:解析Cookie中的票据信息,获得用户角色,创建用户标识

否则:认为用户无权浏览该页面,跳转至登入页面,登入成功后重定向到所请求页面^-^

解释下我的文件目录:

-> Admin文件(该文件目录下内容用户必登入且角色为"Admin"才可浏览)

              -> Admin.aspx

-> User.aspx(该文件只要登入可浏览)

-> Login.aspx(用户登入页面,未登入可浏览)

-> Global.asax

-> web.config

1.web.config文件

view plaincopy to clipboardprint?
<configuration> 
 
  <!-- 配置目录"Admin"下的页面浏览权限 --> 
  <location path="Admin"> 
    <system.web> 
      <authorization> 
        <!-- 拒绝匿名用户访问 --> 
        <deny users="?" roles="User"/> 
        <!--  
            <allow roles="Admin"/> 
            <deny users="?"/> 
            原先这样配置但导致角色"User"也可以访问,不知为何?  
        --> 
      </authorization> 
    </system.web> 
  </location> 
 
    <system.web> 
          <!--  
            通过 <authentication> 节可以配置 ASP.NET 用来   
            识别进入用户的  
            安全身份验证模式。   
        --> 
     <authentication mode="Forms"> 
      <forms loginUrl="Login.aspx" defaultUrl="User.aspx" name=".LoginFormsTicket" path="/" timeout="40" protection="All"> 
        <credentials passwordFormat="Clear"> 
          <user name="lulu" password="66"/> 
        </credentials> 
      </forms> 
    </authentication> 
      
    <!-- 配置网站页面浏览权限 --> 
    <authorization> 
      <!-- 拒绝:?(匿名用户) *(所有用户) --> 
      <deny users="?"/> 
    </authorization> 
 
    </system.web> 
</configuration> 
<configuration>

  <!-- 配置目录"Admin"下的页面浏览权限 -->
  <location path="Admin">
    <system.web>
      <authorization>
        <!-- 拒绝匿名用户访问 -->
        <deny users="?" roles="User"/>
        <!--
            <allow roles="Admin"/>
            <deny users="?"/>
            原先这样配置但导致角色"User"也可以访问,不知为何?
        -->
      </authorization>
    </system.web>
  </location>

 <system.web>
          <!--
            通过 <authentication> 节可以配置 ASP.NET 用来
            识别进入用户的
            安全身份验证模式。
        -->
     <authentication mode="Forms">
      <forms loginUrl="Login.aspx" defaultUrl="User.aspx" name=".LoginFormsTicket" path="/" timeout="40" protection="All">
        <credentials passwordFormat="Clear">
          <user name="lulu" password="66"/>
        </credentials>
      </forms>
    </authentication>
   
    <!-- 配置网站页面浏览权限 -->
    <authorization>
      <!-- 拒绝:?(匿名用户) *(所有用户) -->
      <deny users="?"/>
    </authorization>

    </system.web>
</configuration>

再补充下对Forms身份验证配置文件各项的说明^^:

view plaincopy to clipboardprint?
/* 
<forms>节点中的属性含义: 
name:定义用于存储用户票据的唯一Cookie名 
loginUrl:将用户从定位到哪个页面登入 
defaultUrl:当用户登入成功后默认跳转页面 
timeout:设置用于存储用户票据的唯一Cookie的持续时间(分钟),此时间相对,每次用户进行验证,该Cookie期限被重新设置 
path:设置Cookie的保存路径 
protection有四个值: 
    Encryption:对Cookie内容加密 
    Validation:向Cookie内容添加MAC(消息验证代码),以便服务器判断Cookie是否被篡改 
    None:禁用加密和篡改检查 
    All:同时启用加密和篡改检查 
*/ 
/*
<forms>节点中的属性含义:
name:定义用于存储用户票据的唯一Cookie名
loginUrl:将用户从定位到哪个页面登入
defaultUrl:当用户登入成功后默认跳转页面
timeout:设置用于存储用户票据的唯一Cookie的持续时间(分钟),此时间相对,每次用户进行验证,该Cookie期限被重新设置
path:设置Cookie的保存路径
protection有四个值:
    Encryption:对Cookie内容加密
    Validation:向Cookie内容添加MAC(消息验证代码),以便服务器判断Cookie是否被篡改
    None:禁用加密和篡改检查
    All:同时启用加密和篡改检查
*/

2.Login.aspx页面

view plaincopy to clipboardprint?
//单击登入按钮事件处理  
    protected void login_Click(object sender, EventArgs e)  
    {  
        //通过和配置文件<credentials>节点中定义的用户信息比对,验证用户名密码是否合格  
        //合格  
        if (FormsAuthentication.Authenticate("lulu", "66"))  
        {  
            //创建用户身份验证票据  
            FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(  
                1,                                        //版本信息  
                "lulu",                                   //票据中保存的用户标示  
                DateTime.Now,                             //保存票据的Cookie创建时间  
                DateTime.Now.AddMinutes(40),              //保存票据的Cookie过期时间  
                false,                                    //保存票据的Cookie不永久保存  
                "Admin",                                   //票据中的用户自定义字段,此处用于存放当前用户的角色信息  
                FormsAuthentication.FormsCookiePath       //保存票据的Cookie的保存路径(在Web.config文件中配置)  
            );  
 
            //创建一用于保存用户身份验证票据的Cookie  
            //该Cookie的名在配置文件中定义  
            //该Cookie的值为加密(必须加密!)的数据票据  
            HttpCookie ticketCookie = new HttpCookie(FormsAuthentication.FormsCookieName, FormsAuthentication.Encrypt(ticket));  
 
            //将保存有用户身份验证的票据Cookie加入响应流  
            Response.Cookies.Add(ticketCookie);  
            //返回导致重定向的原始页面请求页面  
            Response.Redirect(FormsAuthentication.GetRedirectUrl("lulu",false), true);  
        }  
        else 
        {  
            Response.Write("用户名密码验证失败!");  
        }  
    } 
//单击登入按钮事件处理
    protected void login_Click(object sender, EventArgs e)
    {
        //通过和配置文件<credentials>节点中定义的用户信息比对,验证用户名密码是否合格
        //合格
        if (FormsAuthentication.Authenticate("lulu", "66"))
        {
            //创建用户身份验证票据
            FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
                1,                                        //版本信息
                "lulu",                                   //票据中保存的用户标示
                DateTime.Now,                             //保存票据的Cookie创建时间
                DateTime.Now.AddMinutes(40),              //保存票据的Cookie过期时间
                false,                                    //保存票据的Cookie不永久保存
                "Admin",                                   //票据中的用户自定义字段,此处用于存放当前用户的角色信息
                FormsAuthentication.FormsCookiePath       //保存票据的Cookie的保存路径(在Web.config文件中配置)
            );

            //创建一用于保存用户身份验证票据的Cookie
            //该Cookie的名在配置文件中定义
            //该Cookie的值为加密(必须加密!)的数据票据
            HttpCookie ticketCookie = new HttpCookie(FormsAuthentication.FormsCookieName, FormsAuthentication.Encrypt(ticket));

            //将保存有用户身份验证的票据Cookie加入响应流
            Response.Cookies.Add(ticketCookie);
            //返回导致重定向的原始页面请求页面
            Response.Redirect(FormsAuthentication.GetRedirectUrl("lulu",false), true);
        }
        else
        {
            Response.Write("用户名密码验证失败!");
        }
    }

3.Global.asax文件

view plaincopy to clipboardprint?
//在安全模块建立起当前用户的有效的身份时,该事件被触发。在这个时候,用户的凭据将会被验证  
    void Application_AuthenticateRequest(object sender, EventArgs e)  
    {  
        //获取当前请求中保存有用户身份票据的Cookie  
        HttpCookie ticketCookie = Request.Cookies[FormsAuthentication.FormsCookieName];  
 
        //如该Cookie不为空,如存在身份票据,解析票据信息,创建用户标识,获取用户角色  
        if (ticketCookie != null)  
        {  
            //获取用户票据  
            FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(ticketCookie.Value);  
 
            string[] roles = ticket.UserData.Split(',');  
              
            //创建用户标识  
            FormsIdentity identity = new FormsIdentity(ticket);  
              
            //创建用户身份主体信息  
            System.Security.Principal.GenericPrincipal user = new System.Security.Principal.GenericPrincipal(identity, roles);  
 
            //把由用户标识,角色信息组成的户身份主体信息保存在User属性中  
            HttpContext.Current.User = user;  
        }  
    }   
//在安全模块建立起当前用户的有效的身份时,该事件被触发。在这个时候,用户的凭据将会被验证
    void Application_AuthenticateRequest(object sender, EventArgs e)
    {
        //获取当前请求中保存有用户身份票据的Cookie
        HttpCookie ticketCookie = Request.Cookies[FormsAuthentication.FormsCookieName];

        //如该Cookie不为空,如存在身份票据,解析票据信息,创建用户标识,获取用户角色
        if (ticketCookie != null)
        {
            //获取用户票据
            FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(ticketCookie.Value);

            string[] roles = ticket.UserData.Split(',');
           
            //创建用户标识
            FormsIdentity identity = new FormsIdentity(ticket);
           
            //创建用户身份主体信息
            System.Security.Principal.GenericPrincipal user = new System.Security.Principal.GenericPrincipal(identity, roles);

            //把由用户标识,角色信息组成的户身份主体信息保存在User属性中
            HttpContext.Current.User = user;
        }
    }  

4.在User.aspx等页面中判断

view plaincopy to clipboardprint?
//判断用户是否验证  
 if (Page.User.Identity.IsAuthenticated)  
 { }  
 
 //确定当前用户是否属于自定角色  
 if (Page.User.IsInRole("Admin"))  
 { } 
       //判断用户是否验证
        if (Page.User.Identity.IsAuthenticated)
        { }

        //确定当前用户是否属于自定角色
        if (Page.User.IsInRole("Admin"))
        { }


原创地址:http://blog.youkuaiyun.com/lulu_jiang/archive/2010/06/10/5661857.aspx

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值