来自于四明山的码农

 

Asp.net forms认证遇到的一个奇怪的问题和测试过程

在很多asp.net项目中,都会采用forms认证,其内部的机制就是把用户数据加密后保存在一个基于cookie的票据FormsAuthenticationTicket中。我所在公司是好几家门店的,项目一上线之后,其中有一家门店,报告上来说:登录页面打得开,就是登录不了。起初还以为是用户输入有误,后来亲自测试之后,发现问题大了。如下是登录页面的代码:

View Code
 FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
                        1,
                        count,
                        DateTime.Now,
                        DateTime.Now.AddMinutes(10),
                        false,
                        "");
                    FormsAuthentication.SetAuthCooki(count,true);
                   Response.Redirect("~/main.aspx");

webconfig代码:

        <authentication mode="Forms">
            <forms name="landrise_aspnet" path="/" loginUrl="~/Login.aspx" timeout="20" defaultUrl="~/Login.aspx"/>
        </authentication>


main.aspx页面的代码:

protected void Page_Load(object sender, EventArgs e)
        {
            if (!Request.IsAuthenticated)
            {
                FormsAuthentication.RedirectToLoginPage();
            }
            else
            {
                string user = Context.User.Identity.Name;
            }
        }

为了避免用户名和密码输错,我把验证用户名和密码程序去掉
用别的门店测试和我自己电脑上IE测试,均都可以转入main.aspx页面,但是用问题店就不可以。本人自己IE测试,都可以进入main.aspx

 

现在用问题门店的电脑分别用火狐,IE6,chrome测试

后来我考滤到有可能是机器系统的原因,然后我用易车网,汽车之家测试,这两个网站也是用asp.net开发的,也是用了forms认证,用问题门店的电脑登录这两个网页

都没有任何问题,说明电脑的cookies是没有问题的。我再用Request.Browser.CookiesRequest.Browser.SupportsRedirectWithCookie。进行测试

均为true;问题始终没有解决。还有一个奇怪的现象,有一段时间,用谷歌浏览器居然好了,再次编译又不行,当然这个现象只出现了两次。

结论:

1、我怀疑forms认证是否有bug。

2、如果电脑系统问题,易车网,汽车之后为何可以?

3、单步测试之中,user.Identity.Name一直为空。而且在所有电脑上都有可以。

4、Context.User.Identity.IsAuthenticated在问题门店浏览器上一直为false,正常电脑上IE,火狐上测试为true。

 

问题解决:

     有可能是问题门店的机器cookie异常,每次清除一下就是可以重新登录。后来在

Vincent Yang(水平不错)

的建议下,改用cookieless="useUrl"这样就解决了。

用了AutoDetect还是不行,说明这个cookie是没有被禁用的,可能出现异常。

 最新的一项测试:

代码改成:

  FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
                        1,
                        count,
                        DateTime.Now,
                        DateTime.Now.AddMinutes(10),
                        false,
                        "");
                    string encTicket = FormsAuthentication.Encrypt(ticket);
                  // FormsAuthentication.SetAuthCookie(count, true);
                    Response.Cookies.Add(new HttpCookie(FormsAuthentication.FormsCookieName, encTicket));
                   Response.Redirect("~/main.aspx");

然后在web.config中把cookieless="useurl"改成cookieless="AutoDetect",这样又起作用了,我建议还是用这种方法。如果
userUrl的话,C#代码还是要改成FormsAuthentication.SetAuthCookie(count, true);

posted on 2012-08-09 14:59  技术先锋  阅读(2569)  评论(31编辑  收藏  举报

导航