[问题描述]

web.config中这样配置:

    <authentication mode="Forms"> 
        
<forms name=".ASPXAUTH " loginUrl="secure/logon.aspx" timeout="30" protection="All">
        
</forms> 
    
</authentication>  

    <authorization>
        
<deny users="?" />
    
</authorization>


secure/login.aspx 中,验证用户名以后,我用如下的代码设置cookie:

    FormsAuthentication.RedirectFromLoginPage( userinfo.UserName , chkPersistCookie.Checked );

 

程序执行以后,再转到其他页面,会重新回到登录页面,也就是说用户验证并没有成功。
 
   到底是什么原因?

 

 

[尝试1]

 

参考了一下Duwamish的源代码,改成这样:

 

web.config:

 
 

    <authentication mode="Forms"> 

         
<forms name=".ADUAUTH " loginUrl="secure/logon.aspx"  protection="All">

         
</forms> 

</authentication>    

 

 <authorization>

      
<allow users="*" />

</authorization>

 

验证用户名后的代码:

              //登录成功,返回初始请求页面

              FormsAuthentication.RedirectFromLoginPage( 
"*" , chkPersistCookie.Checked );

 



结果运行的时候无论打开什么页面都是直接进入了,Forms验证失去了作用,想想也对, allow users=*,就是允许所有用户访问了,可是Duwamish怎么就可以那?

 

 

[尝试2]

现在将allow users=* 改成 deny users=?,结果还是出现第一种情况,就是无论打开什么页面都重新返回登录页面。

 

[尝试3]

              //登录成功,返回初始请求页面

              FormsAuthentication.RedirectFromLoginPage( 
"*" , chkPersistCookie.Checked );

改成

              //登录成功,返回初始请求页面

              FormsAuthentication.RedirectFromLoginPage( userinfo.UserName , chkPersistCookie.Checked );

 

结果还是出现第一种情况,就是无论打开什么页面都重新返回登录页面。


天哪,疯了·!

 

[尝试4]

先用一个无验证页面测试是否能取出cookie,。具体步骤如下:

先访问一个有验证的页面(login.aspx),此时将会自动转到login.aspx页面,输入用户名、密码验证成功以后,再转到一个无验证的页面,遍历cookie的结果如下:

 

名称 = .ADUAUTH

 

= 3CFEC8F95530FCC4B15EA3AB6D9F4F2A3476462A3CC2D5D96B57317F1B23EBD96CD857DB4B41FFC8BCCC137F526E3705821A9C11AC02180D04005F120B0217223AED9478332F34B9

 

说明只写入了一个cookie  .ADUAUTH 而没有将当前用户名写进去,那么下一步应该怎么办哪?

 

  

[尝试5]

 因为我的登陆部分放在一个用户控件里面了,所以FormsAuthentication.RedirectFromLoginPage这个函数是在用户控件中被执行的。
     我做了一些改动,在用户控件中添加了一个事件Sucess,当验证成功后触发这个事件,然后在承载这个用户控件的页面中来处理事件,从而将FormsAuthentication.RedirectFromLoginPage函数在aspx页面中调用,测试结果是事件被成功的执行了,而且FormsAuthentication.RedirectFromLoginPage这个函数也被成功的执行了,可是每次打开其他页面,还是自动返回登陆页面。
    后来在不用验证的页面中检查cookie,将当前所有cookie写出来以后,发现只有一个名称为.ADUAUTH的cookie,现在问题有2:
    (1) 这个名为.ADUAUTH的cookie是什么时候被设置上去的,是做什么用的?
    (2) 现在的问题已经可以定位于:包含当前用户信息的cookie没有设置成功。下面只要将cookie设置成功就可以了。自己怎么样设置cookie才能达到FormsAuthentication.RedirectFromLoginPage函数的效果,也就是设置用户cookie,是否记住密码,自动转回起始请求页面?

  

[尝试6]

换了一种方法来实现FormsAuthentication.RedirectFromLoginPage的功能:

            //-------------------------------------------------------------------------------------------------
            
//因为执行这个函数的时候总是不能成功的设置cookie,所以暂时不用这个方法,而用另外一个设置cookie的方法
            
//FormsAuthentication.RedirectFromLoginPage( e.user_name , e.persist_cookie );
            
//-------------------------------------------------------------------------------------------------
            
            FormsAuthenticationTicket tkt;
            
string cookiestr;
            HttpCookie ck;
            tkt
=new FormsAuthenticationTicket(1 , e.user_name , DateTime.Now , DateTime.Now.AddMinutes(30) , e.persist_cookie , "your custom data"); //创建一个验证票据
            cookiestr=FormsAuthentication.Encrypt(tkt);//并且加密票据
            ck=new HttpCookie( e.user_name ,cookiestr);// 创建cookie
            if( e.persist_cookie ) //如果用户选择了保存密码
                ck.Expires=tkt.Expiration;//设置cookie有效期
            ck.Path=FormsAuthentication.FormsCookiePath;//cookie存放路径
            Response.Cookies.Add(ck);
            
string strRedirect;
            strRedirect
=Request["ReturnUrl"];

            
if(strRedirect==null)
                strRedirect
="default.aspx";
            Response.Redirect(strRedirect,
true);


结果还是一样,还是无法设置cookie,到底是怎么回事啊?

在上面代码的页面上作了一个链接,链接到一个无身份验证的页面,在其中用下面的代码读取cookie:

            //将页面中所有的cookie都写出来
            string output;
            HttpCookie aCookie;
            
string subkeyName;
            
string subkeyValue;

            output 
= "";

            
forint i = 0 ; i < Request.Cookies.Count - 1 ; i++ )
            {    
                aCookie 
= Request.Cookies[i];
                output 
+= "名称 = " + aCookie.Name + "<br>";

                
if( aCookie.HasKeys )
                {
                    
forint j = 0 ; j < aCookie.Values.Count - 1 ; j++ )
                    {
                        subkeyName 
= Server.HtmlEncode(aCookie.Values.AllKeys[j]);
                        subkeyValue 
= Server.HtmlEncode(aCookie.Values[j]);
                        output 
+= "子键名称 = " + subkeyName + "<br>";
                        output 
+= "子键值 = " + subkeyValue + "<br><br>";
                    }
                }
                
else
                {
                    output 
+= "值 = " + Server.HtmlEncode(aCookie.Value) + "<br><br>";
                }
            }

            
forint i = 0 ; i < Response.Cookies.Count - 1 ; i++ )
            {    
                aCookie 
= Response.Cookies[i];
                output 
+= "名称 = " + aCookie.Name + "<br>";

                
if( aCookie.HasKeys )
                {
                    
forint j = 0 ; j < aCookie.Values.Count - 1 ; j++ )
                    {
                        subkeyName 
= Server.HtmlEncode(aCookie.Values.AllKeys[j]);
                        subkeyValue 
= Server.HtmlEncode(aCookie.Values[j]);
                        output 
+= "子键名称 = " + subkeyName + "<br>";
                        output 
+= "子键值 = " + subkeyValue + "<br><br>";
                    }
                }
                
else
                {
                    output 
+= "值 = " + Server.HtmlEncode(aCookie.Value) + "<br><br>";
                }
            }


            Label1.Text 
= output;

结果是:

名称 = ASP.NET_SessionId
值 
= ss3dmuazk13gsl55ulaxuk45

可以看出,当前用户名的cookie并没有被取出来,是没有设置上那,还是没有读出来那?

    在第一段代码中加入读取Response.Cookie( e.UserName ).Value的代码,可以读出e.UserName对应的cookie值;加入读取Request.Cookie( e.UserName ).Value的代码,可以读出e.UserName对应的cookie值。那么现在的问题有二:
    (1)   Response.Cookie和Request.Cookie到底有什么区别
    (2)   为什么在设置cookie的页面可以读出Response.Cookie和Request.Cookie的值,而在另外一个页面用Response.Cookie和Request.Cookie都不能读取出来那?
   

  

[尝试7]

用了下面的两个页面测试浏览器是否接受cookie:

TestIECookie1.aspx

        private void Page_Load(object sender, System.EventArgs e)
        {
            
if!Page.IsPostBack )
            {
                
if( Request.QueryString["AcceptsCookies"== null )
                {
                    Response.Cookies[
"TestCookie"].Value = "ok";
                    Response.Cookies[
"TestCookie"].Expires = DateTime.Now.AddMinutes(1);
                    Response.Redirect(
"TestForCookies.aspx?redirect=" + Server.UrlEncode(Request.Url.ToString()));
                }
                
else
                {
                    labelAcceptsCookies.Text 
= "接受 Cookie = " + Request.QueryString["AcceptsCookies"];
                }
            
            }

        }

TestForCookies.aspx

        private void Page_Load(object sender, System.EventArgs e)
        {
            
// 在此处放置用户代码以初始化页面
            string redirect = Request.QueryString["redirect"];
            
string acceptsCookies;

            
//是否接受 Cookie?
            if ( Request.Cookies["TestCookie"== null )
            {
                
//没有 Cookie,因此不需要接受
                acceptsCookies = "0";
            }
            
else
            {
                acceptsCookies 
= "1";
                
//删除测试 Cookie
                Response.Cookies["TestCookie"].Expires = DateTime.Now.AddDays( -1 );
            }

            Response.Redirect( redirect 
+ "?AcceptsCookies=" + acceptsCookies ,  true );

        }

浏览TestIECookie1.aspx,结果是:

 接受 Cookie = 1


说明IE浏览器可以接受cookie.

[注]该尝试的原理参见 http://www.microsoft.com/china/MSDN/library/archives/library/dv_vstechart/html/vbtchaspnetcookies101.asp#vbtchaspnetcookies101anchor10


说明不是IE的问题,那么到底是哪里的问题那?

posted on 2006-01-20 10:51  今夜太冷  阅读(999)  评论(1编辑  收藏  举报