• 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);

  • 相关阅读:
    20145224&20145238 《信息安全系统设计基础》 第四次实验
    20145224&20145238 《信息安全系统设计基础》 第三次实验
    《信息安全系统设计基础》 第十一周学习总结
    20145211《信息安全系统设计基础》实验二 固件设计
    20145211《信息安全系统设计基础》实验五 网络通信
    20145211《信息安全系统设计基础》课程总结
    20145211 《信息安全系统设计基础》第十四周学习总结
    20145211 《信息安全系统设计基础》第十三周学习总结
    20145211《信息安全系统设计基础》第十二周学习总结
    GDB调试汇编堆栈过程分析
  • 原文地址:https://www.cnblogs.com/Anders888/p/2630280.html
Copyright © 2020-2023  润新知