[问题描述]
在web.config中这样配置:
<forms name=".ASPXAUTH " loginUrl="secure/logon.aspx" timeout="30" protection="All">
</forms>
</authentication>
<deny users="?" />
</authorization>
在secure/login.aspx 中,验证用户名以后,我用如下的代码设置cookie:
程序执行以后,再转到其他页面,会重新回到登录页面,也就是说用户验证并没有成功。
到底是什么原因?
[尝试1]
参考了一下Duwamish的源代码,改成这样:
web.config:
<forms name=".ADUAUTH " loginUrl="secure/logon.aspx" protection="All">
</forms>
</authentication>
<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]
我做了一些改动,在用户控件中添加了一个事件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:
string output;
HttpCookie aCookie;
string subkeyName;
string subkeyValue;
output = "";
for( int i = 0 ; i < Request.Cookies.Count - 1 ; i++ )
{
aCookie = Request.Cookies[i];
output += "名称 = " + aCookie.Name + "<br>";
if( aCookie.HasKeys )
{
for( int 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>";
}
}
for( int i = 0 ; i < Response.Cookies.Count - 1 ; i++ )
{
aCookie = Response.Cookies[i];
output += "名称 = " + aCookie.Name + "<br>";
if( aCookie.HasKeys )
{
for( int 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;
结果是:
值 = 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
{
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
{
// 在此处放置用户代码以初始化页面
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,结果是:
说明IE浏览器可以接受cookie.
[注]该尝试的原理参见 http://www.microsoft.com/china/MSDN/library/archives/library/dv_vstechart/html/vbtchaspnetcookies101.asp#vbtchaspnetcookies101anchor10
说明不是IE的问题,那么到底是哪里的问题那?
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架