none
Asp.net多二级域名网站的登陆问题 RRS feed

  • 问题

  • 我单独用一个项目来做会员的登陆及验证等操作,但是发现有些用户无法登陆,有些用户可以登陆,很奇怪,不知道是什么问题

    下面是登陆的代码:

           /// <summary>
           /// 保存登陆用户
           /// </summary>
           /// <param name="model">用户信息</param>
           public static void Save(iSchool.Model.User_Data model)
           {
               //检测Cookies是否存在
               HttpCookie cookie = HttpContext.Current.Request.Cookies["UserInfo"];
               if (cookie == null)
               {
    
                   cookie = new HttpCookie("UserInfo");
                   cookie.Expires = DateTime.Now.AddHours(2);
                   //cookie.Domain = ".dmc-edu.com";
    
                   if(!WebCore.Config.CacheKey.DeBug())
                       cookie.Domain = WebCore.Config.CacheKey.CookieDomain();
    
                   cookie.Values.Add("UserName", model.User_Name);
                   cookie.Values.Add("Uid", model.User_ID.ToString());
                   cookie.Values.Add("SessionID", model.User_SessionID);
    
                   HttpContext.Current.Response.Cookies.Add(cookie);
               }
               else
               {
                   cookie.Expires = DateTime.Now.AddHours(2);
    
                   if (!WebCore.Config.CacheKey.DeBug())
                       cookie.Domain = WebCore.Config.CacheKey.CookieDomain();
    
                   cookie.Values.Add("UserName", model.User_Name);
                   cookie.Values.Add("Uid", model.User_ID.ToString());
                   cookie.Values.Add("SessionID", model.User_SessionID);
    
                   HttpContext.Current.Response.Cookies.Set(cookie);
               }
           }
    

    下面是验证登陆的代码:

           /// <summary>
           /// 返回用户的登录状态
           /// </summary>
           /// <returns></returns>
           public static bool Check()
           {
               System.Web.HttpCookie cookie = System.Web.HttpContext.Current.Request.Cookies["UserInfo"];
               if (null == cookie)
               {
                   return false;
               }
               else
               {
                   int uid = WebCore.Base.Convert.ToInt(cookie["uid"]);
                   //检测是否单点登陆
                   //取得用户数据
                   iSchool.DAL.User_Data dal = new iSchool.DAL.User_Data();
                   iSchool.Model.User_Data model = dal.GetModel(uid);
                   if (null == model)
                   {
                       return false;
                   }
                   //匹配用户数据( 准备做单点登陆)
                   if (model.User_SessionID !=  cookie["SessionID"].ToString())
                   {
                       return true;
                   }
                   else
                   {
                       return true;
                   }
               }
           }
    

     求解。。。

    2010年3月22日 7:03

答案

  • 1. 不必判断是否已经存在Cookie, 直接Response.Cookies.Add 是没有问题的.

    2. 设定了有效期的cookie必须设定作用域(就是被你注释掉的domain设置)

    3. 今天早上我的同事刚遇到一个情况, 他不小心改掉了自己电脑上的时间(比真实时间快了一个星期!). 导致Cookie始终无法保存, 因为设定的日期在客户端浏览器上总是过期的. 可以检查一下是否这个原因.

    • 已标记为答案 Free-Shi 2010年3月22日 9:58
    2010年3月22日 7:19

全部回复

  • 1. 不必判断是否已经存在Cookie, 直接Response.Cookies.Add 是没有问题的.

    2. 设定了有效期的cookie必须设定作用域(就是被你注释掉的domain设置)

    3. 今天早上我的同事刚遇到一个情况, 他不小心改掉了自己电脑上的时间(比真实时间快了一个星期!). 导致Cookie始终无法保存, 因为设定的日期在客户端浏览器上总是过期的. 可以检查一下是否这个原因.

    • 已标记为答案 Free-Shi 2010年3月22日 9:58
    2010年3月22日 7:19
  • 恩,谢谢,我的代码中增加了一个判断

    if(!WebCore.Config.CacheKey.DeBug())
                       cookie.Domain = WebCore.Config.CacheKey.CookieDomain();

    其实这个就是判断一下是否是调试状态,调试状态的话,就不要写入Domain ,如果不是调试,会写入的

    Cookies.Set 应该也是可以的,要不大部分机器都会挂掉,呵呵

     

    第三条,我觉得有可能,但是一般来说,机器的时间比显示时间快的不多,

    谢谢您的答复!~

    问题没解决,期待中。。。。

    2010年3月22日 8:18