当前位置:编程学习 > C#/ASP.NET >>

身份验证用什么最稳定?为什么我设的Session不能保持?

我想做一个多人访问的网站,用的是ASP.NET 2008的,用的Session来保存用户的身份和状态,发布到网上发现大部用户可以正常访问,但一小部分用户的机器总是无易做图常登录,每次登录后都会象没登录一样,重新回到登录页(预设没登录自动跳到登录页)。请各位大侠帮忙分析下,是什么原因?用什么方法更好?
附代码如下

         string getUID = Request.QueryString["UID"].ToString();
        string getPWD = Request.QueryString["PWD"].ToString();
        Response.ContentType = "text/xml";

        //-------------
        SqlConnection Conn = new SqlConnection(MyConnectionString);

        string queryString = "SELECT UserID, Pwd, Name, uRole, isTry, LoginCount,EndDTime,AllowUse,getdate() as DTNowDate FROM UserInfo " +
        " WHERE (UserID =@UID)";
        SqlCommand Command = new SqlCommand();
        Command.Connection = Conn;
        Command.CommandType = CommandType.Text;
        Command.CommandText = queryString;

        SqlParameter Parameter_userid = new SqlParameter();
        Parameter_userid.ParameterName = "@UID";
        Parameter_userid.Value = getUID;
        Parameter_userid.DbType = DbType.StringFixedLength;
        Command.Parameters.Add(Parameter_userid);

        Boolean isHaveID = false;
        Boolean isLogin = false;
        Conn.Open();
        try
        {
            SqlDataReader Rd = Command.ExecuteReader();
            if (Rd.Read())
            {
                if (Rd["Pwd"].ToString().Trim() == getPWD.Trim())
                {
                    DateTime fDTNowDate = (DateTime)Rd["DTNowDate"];
                    DateTime fEndDTime = (DateTime)Rd["EndDTime"];
                    Boolean fAllowUse = (Boolean)Rd["AllowUse"];
                    fisTry = (Boolean)Rd["isTry"];
                    fLoginCount = Rd["LoginCount"].ToString();


                    isLogin = true;//密码通过,下面还要进行其它验证
                    resuInfo = "OK";

                    string UqueryString = "";
                    //1.是否试用,第一次登录---暂 不进行检查 到期与限制
                    if (fisTry & fLoginCount == "0")
                    {
                        //从当前时间更改到期+ 15天
                        //UqueryString = "UPDATE UserInfo SET LastDTime=getdate(),LoginCount=LoginCount+1,EndDTime=getdate()+15  WHERE UserID=@UserID ";
                        UqueryString = "UPDATE UserInfo SET LastDTime=getdate(),LoginCount=LoginCount+1,EndDTime=getdate()+tryDays  WHERE UserID=@UserID ";
                    }
                    else
                    {
                        UqueryString = "UPDATE UserInfo SET LastDTime=getdate(),LoginCount=LoginCount+1 WHERE UserID=@UserID ";

                        //2.是否到期:帐号已到期,请续费
                        if (fDTNowDate > fEndDTime)
                        {
                            //帐号到期
                            resuInfo = "帐号已到期,请续费";
                            isLogin = false;
                        }
                        else
                        {
                            //3.是否被限制:此帐号已被限制
                            if (!fAllowUse)
                            {
                                //被限制
                                resuInfo = "此帐号已被限制";
                                isLogin = false;
                            }
                        }
                    }

                    if (isLogin)
                    {
                        Session["UName"] = Rd["Name"].ToString();
                        Session["URole"] = Rd["uRole"].ToString();

                        Session["UID"] = getUID;
                        Session["isLogin"] = "TRUE";
                        Session["PID"] = "P01";//初始文章
 
                    }
                }
                else
                {
                    resuInfo = "密码不正确";
                }
            }
            else
            {
                resuInfo = "帐号不正确" + getUID;
            }
        }
        finally
        {
            if (Conn != null)
            {
                Conn.Close();
            }
        } --------------------编程问答-------------------- 如果时间保持长的话可以用cookie,用session的时候,要设置持续时间,
具体修改方法如下,在web.config中进行如下配置 
<system.web>
    <sessionState mode="InProc" timeout="30"/>//修改timeout时间
</system.web> --------------------编程问答-------------------- <sessionState mode="Off|InProc|StateServer|SQLServer"
              cookieless="true|false"
              timeout="number of minutes"
              stateConnectionString="tcpip=server:port"
              sqlConnectionString="sql connection string"
              stateNetworkTimeout="number of seconds"
/>
 

必须有的属性是

属性 选项 描述 
mode  设置将Session信息存储到哪里 
 Off 设置为不使用Session功能 
 InProc 设置为将Session存储在进程内,就是ASP中的存储方式,这是默认值。 
 StateServer 设置为将Session存储在独立的状态服务中。 
 SQLServer 设置将Session存储在SQL Server中。 
--------------------编程问答-------------------- --------------------编程问答-------------------- TO chengqscjh:
我用的是 <sessionState mode="StateServer" /> 资料上说是可以保存在独立进程中,比较稳定

如果用的是Cookie的话,如果用户关闭浏览器的Cookie,会不会出问题呢? --------------------编程问答--------------------
引用 4 楼 gxywl 的回复:
TO chengqscjh: 
我用的是 <sessionState mode="StateServer" /> 资料上说是可以保存在独立进程中,比较稳定 

如果用的是Cookie的话,如果用户关闭浏览器的Cookie,会不会出问题呢?


==
从ASP.NET 1.1 Session就支持无Cookie的回话,此时Sessonid保存在用户的url地址栏里 --------------------编程问答-------------------- To amandag:
这是我用的Web.config部分

  <sessionState mode="StateServer" />
。。。
   <authentication mode="Window" />

但有部分计算机登录时出现问题。 --------------------编程问答-------------------- <sessionState mode="Off ¦InProc ¦StateServer ¦SQLServer" 
              cookieless="true ¦false" 
              timeout="number of minutes" 
              stateConnectionString="tcpip=server:port" 
              sqlConnectionString="sql connection string" 
              stateNetworkTimeout="number of seconds" 
/> 


必须有的属性是 

属性 选项 描述 
mode  设置将Session信息存储到哪里 
Off 设置为不使用Session功能 
InProc 设置为将Session存储在进程内,就是ASP中的存储方式,这是默认值。 
StateServer 设置为将Session存储在独立的状态服务中。 
SQLServer 设置将Session存储在SQL Server中。 

--------------------编程问答-------------------- TO lingxyd_0:
这个楼上发过了 --------------------编程问答-------------------- COOKIE这个好用些,你要是用SQLSERVER做又要加好多的东西
--------------------编程问答-------------------- (1)Cookie很多用户会禁用,这是部分用户不能使用的原因。如果你在写Cookie时进行验证,则基本不存在什么问题了。
(2)SQL Server麻烦一些,但保证一定都可以。 --------------------编程问答-------------------- session mode=sqlserver
--------------------编程问答-------------------- 学习 --------------------编程问答-------------------- 可以用cookie. --------------------编程问答-------------------- --------------------编程问答-------------------- 用传票吧,基于cookie的,又比cookie安全性高 --------------------编程问答--------------------
引用 15 楼 Pig23 的回复:
用传票吧,基于cookie的,又比cookie安全性高


传票让我想到了易做图................. --------------------编程问答-------------------- 这个不太清楚,个人一直用Session
补充:.NET技术 ,  ASP.NET
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,