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

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.Cookies 和 Request.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);