form表单验证的原理

    技术2026-01-14  10

    先说说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.csdn.net/lulu_jiang/archive/2010/06/10/5661857.aspx

    最新回复(0)