zoukankan      html  css  js  c++  java
  • [导入]一个Form验证的方案

    asp.net自己带了一个可以自动生成认证的类,但这个FormsAuthentication自动的Cookie除了包含认证票据以外,不能自己带其它的数据。

    而对于一个项目来说,可能要对浏览者进行不同类型的验证,而对于asp的写法来说,就是用session来验证。我不喜欢这样的方法,而且这样的话也就不能实现自动登录了。

    还好,.net里带了一个可以自己定义票据的方法,这样我们一方面可以进行自动登录,另一方面还可以对不用的用户进行验证。下面是一个生成票据的代码:

      public virtual  void Login(bool i_autoLogin)
      {
       string m_userData = this.m_userID.ToString()+","+this.m_loginName+","+this.m_userType.ToString();
       FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
        1,
        "WebbUser",
        System.DateTime.Now,
        System.DateTime.Now.AddDays(30),
        i_autoLogin,
        m_userData,
        "/");
       string encTicket = FormsAuthentication.Encrypt(ticket);
       HttpContext.Current.Response.Cookies.Add(new HttpCookie("WebbUser", encTicket));
      }

    其中m_userData可以是很长的字符串,而且生成的cookies经过了加密(简单的)。显然,这里只是会记录一些用户ID,TYPE等信息,不会记录密码等重要信息,当然也不会有什么太大的问题。接下来就是如何取得cookies里的信息并且加以认证。

    取回cookies:

      protected void GetDataFromCookie()
      {
       if(User.Identity.IsAuthenticated)
       {
        string m_userData;
        FormsIdentity id = (FormsIdentity)User.Identity;
        FormsAuthenticationTicket ticket = id.Ticket;
        m_userData  = ticket.UserData;
        if(m_userData!=null)
        {
         SetUserData(m_userData);
        }
       }
      }

      private void SetUserData(string m_Data)
      {
       string[] m_string = m_Data.Split(new char[]{','});
       if(m_string.Length==3)
       {
        this.m_user.UserID  = Convert.ToInt64(m_string[0]);
        this.m_user.LoninName = m_string[1];
        this.m_user.UserType = PageHelper.ConvertToUserTypes(m_string[2]);
       }
      }

    显然这里我用了‘,’来分隔用户信息,其中我添加了三条用户信息,一条为用户ID,一条为用户名,最后一条为用户类型。而且在取回信息的时候,用它来给m_user对象赋值。

    下面就是来验证它了:首先写一个基类(BasePage),以后所有的Form都从它派生,这样就可以自动验证用户了。它里面写一个可重载函数,用于对不同的页面进行判断:
      #region IUIPage Members
      virtual public bool CheckUserType(){return false;}
      virtual public void InitUser(object sender, EventArgs e){}
      #endregion

    而且在页面载入的时候进行验证:

      public void BasePage_Load(object sender, System.EventArgs e)
      {  
       if(!CheckUserType())
       {
        this.UserSignOut();
       }
    }

    而实现的验证代码在不同的页面里:例如一个Admin_Main.aspx.cs里,它的验证可能是这样的:
      public override bool CheckUserType()
      {
       return this.m_user.UserType==UserTypes.Admin?true:false;
      }
      public override void InitUser(object sender, EventArgs e)
      {
       this.m_user = new WebbAdmin2() as IVisitor;
       this.GetDataFromCookie();
      }

    而在Client_Main.aspx.cs里可能是这样的:
      public override bool CheckUserType()
      {
       return this.m_user.UserType==UserTypes.Client?true:false;
      }
      public override void InitUser(object sender, EventArgs e)
      {
       this.m_user = new WebbClient() as IVisitor;
       this.GetDataFromCookie();
      }

    这样,页面就可以自动登录,而且可以自动识别用户类型了。本来我想再写一个类,把所有的admin页面都从它继承,可惜,VS.net2003里面的一个小BUG,使得我这样的做法失败。而且BasePage里的验证函数只能是可重载的,不能是虚拟的,否则还可以方便一点,算了,反正代码也不是很长,每一个页面里添加它就行了。


    文章来源:http://computer.mblogger.cn/wucountry/posts/49736.aspx
    ================================
      /\_/\                        
     (=^o^=)  Wu.Country@侠缘      
     (~)@(~)  一辈子,用心做一件事!
    --------------------------------
      学而不思则罔,思而不学则怠!  
    ================================
  • 相关阅读:
    PHP中的无限级分类
    JS中json数据格式取值实例
    PHP中类的延迟绑定
    电阻
    不能做“没事找抽型”投资者
    Delphi相关文件扩展名介绍
    三极管
    沃伦·巴菲特
    电压,电流,电阻的关系就是欧姆定律
    CnPack 使用的组件命名约定
  • 原文地址:https://www.cnblogs.com/WuCountry/p/305637.html
Copyright © 2011-2022 走看看