在cookie中通常会保存有登录会话的ID。例如在登录时,你可以在ashx中将用户的登录名、登录时间、主要授权权限、甚至购物车、优惠等等,凡是跟用户直接有关的信息,都写到一个对象中(或者说是一个叫做Passport的数据库表的记录中),然后将这个对象的ID做为ashx的返回值。而javascript程序将返回值写到cookie中。只需要保存一个ID号,而不需要保存过多的信息到客户端。在其它ashx中,可以通过Reqeust读取cookie找到这个ID,通过这个编号就可判断用户的各种身份信息、权限信息等等。

解决方案 »

  1.   

    如果使用ashx作为开放接口,如何做身份验证 ?
      

  2.   

    以下是我实现的一般处理程序的基类调用// 读取权限基类
    using System;
    using System.Web;
    using System.Web.SessionState;
    using CEMS.BLL;namespace CEMS.Web.Handles
    {
        public class HandleBase : IHttpHandler, IRequiresSessionState
        {
            #region 属性定义        private bool _PageRead = true;
            private bool _PageAdd = true;
            private bool _PageUpdate = true;
            private bool _PageDel = true;
            private string _UserID = LoginCls.GetUserID();
            private string _UserName = LoginCls.GetUserName();
            private string _virDir = ""; //网站虚拟目录
            private HttpContext _PageContext;        /// <summary>
            /// 当前登录的用户ID
            /// </summary>
            public string UserID
            {
                get { return _UserID; }
            }
            /// <summary>
            /// 当前登录的用户姓名
            /// </summary>
            public string UserName
            {
                get { return _UserName; }
            }
            /// <summary>
            /// 是否具有读取权限
            /// </summary>
            public bool PageRead
            {
                get { return _PageRead; }
                set { _PageRead = value; }
            }
            /// <summary>
            /// 是否具有新增权限
            /// </summary>
            public bool PageAdd
            {
                get { return _PageAdd; }
                set { _PageAdd = value; }
            }
            /// <summary>
            /// 是否具有修改权限
            /// </summary>
            public bool PageUpdate
            {
                get { return _PageUpdate; }
                set { _PageUpdate = value; }
            }        /// <summary>
            /// 是否具有删除权限
            /// </summary>
            public bool PageDel
            {
                get { return _PageDel; }
                set { _PageDel = value; }
            }        public string VirtualDirectory
            {
                get { return _virDir; }
                set { _virDir = value; }
            }        public HttpContext PageContext
            {
                get { return _PageContext; }
                set { _PageContext = value; }
            }        public bool IsReusable
            {
                get
                {
                    return false;
                }
            }        #endregion        public void ProcessRequest(HttpContext context)
            {
                context.Response.ExpiresAbsolute = DateTime.Now.AddDays(-1);
                context.Response.Expires = 0;
                context.Response.CacheControl = "no-cache";            _PageContext = context;
                _virDir = context.Application["VirtualDirectory"].ToString();            int v = LoginCls.IsLogin();
                if (v != 430 && v != 433)
                {
                    context.Response.Redirect(_virDir + "/Error.aspx?ErrCode=" + v.ToString());
                    context.Response.End();
                }
                GetThisLimit();
                UpdateValid();
                AddValid();
                DeleteValid();
                AjaxProcess(context);
            }        /// <summary>
            /// 用这个替代ProcessRequest,在ashx中使用override重写
            /// </summary>
            public virtual void AjaxProcess(HttpContext context) { }        /// <summary>
            /// 验证是否有修改权限
            /// </summary>
            public virtual void UpdateValid() { }        /// <summary>
            /// 验证是否有添加权限
            /// </summary>
            public virtual void AddValid() { }        /// <summary>
            /// 验证是否有删除权限
            /// </summary>
            public virtual void DeleteValid() { }        public static void outText(string txt)
            {
                HttpContext.Current.Response.ContentType = "text/plain";
                HttpContext.Current.Response.StatusCode = 200;
                HttpContext.Current.Response.Write(txt);
            }        private void GetThisLimit()
            {
                string filepath = GetFilePath();
                if (filepath == "/main.aspx")   //main.aspx文件
                    return;            Employee_LoginLimit bll = new Employee_LoginLimit();  //从数据库中读取用户对当前执行页面的权限
                Employee_LoginLimit.FileLimit myLimit = bll.GetLimitByFile(UserID, filepath);
                _PageRead = myLimit.read;
                _PageAdd = myLimit.add;
                _PageUpdate = myLimit.update;
                _PageDel = myLimit.del;
            }        private string GetFilePath()
            {
                string f = _PageContext.Request.UrlReferrer.AbsolutePath.ToLower();            if (!string.IsNullOrWhiteSpace(_virDir))
                    f = f.Substring(_virDir.Length);
                return f;
            }
        }
    }// 新增权限基类,继续读取权限基类
    using System.Web;namespace CEMS.Web.Handles
    {
        public class HandleBaseForAdd:HandleBase
        {
            public override void AddValid()
            {
                if (!PageAdd)
                {
                    HttpContext context = PageContext;
                    context.Response.Redirect(VirtualDirectory + "/Error.aspx?ErrCode=405");  //没有权限,跳转到错误页面
                    context.Response.End();
                }
            }
        }
    }//修改权限基类
    using System.Web;namespace CEMS.Web.Handles
    {
        public class HandleBaseForUpdate : HandleBase
        {
            public override void UpdateValid() 
            {
                if (!PageUpdate)
                {
                    HttpContext context = PageContext;
                    context.Response.Redirect(VirtualDirectory + "/Error.aspx?ErrCode=405");  //没有权限,跳转到错误页面
                    context.Response.End();
                }
            }
        }
    }//删除权限基类
    using System.Web;namespace CEMS.Web.Handles
    {
        public class HandleBaseForDelete:HandleBase
        {
            public override void DeleteValid()
            {
                if (!PageDel)
                {
                    HttpContext context = PageContext;
                    context.Response.Redirect(VirtualDirectory + "/Error.aspx?ErrCode=405");  //没有权限,跳转到错误页面
                    context.Response.End();
                }
            }
        }
    }//调用示例,以新增权限为例
    using System.Web;
    using CEMS.Helper;namespace CEMS.Web.Handles
    {
        /// <summary>
        /// 
        /// </summary>
        public class Test : HandleBaseAdd
        {
            public override void AjaxProcess(HttpContext context)
            {
                context.Response.ContentType = "text/plain";
                string mid = context.Request["id"];
                outText("你有新增的权限");
            }
        }
    }
      

  3.   

    class就可以的
    /// <summary>
    /// 所有的aspx.cs页面必须继承的基类,用于全局判断用户是否登陆.
    /// </summary>
    public class BasePage:Page
    {
        public BasePage()
        {
        }
        protected override void OnInit(EventArgs e)
        {
            if (Session["user"]==null)
            {
                Response.Redirect("~/default.aspx");
            }
            base.OnInit(e);
        }
    }然后 所有的aspx都继承它
    public partial class _Default :BasePage
    就可以咯
      

  4.   

    我想楼主是想在一般处理程序中实现的继承,不是在aspx中