看c#看不懂了,看forms验证的第4篇也是迷迷糊糊的,懂了它的意思,但是我实现起来就打不到效果,还报了错误。验证视图状态 MAC 失败。如果此应用程序由网络场或群集承载,请确保 <machineKey> 配置指定了相同的 validationKey 和验证算法。不能在群集中使用 AutoGenerate。估计是我在machine.config中配置的秘钥与页面的算法不同,我把machine里的删除了还是报错,参照网上的说法把web.config里的<page>加入<pages enableEventValidation= "false " viewStateEncryptionMode = "Never " / > 同样没有解决。不搞这个了,先放下。 他是这样实现单登陆跨域名的 不管是从哪里登陆的,都同一把用户名与密码交给通一个页面A进行处理,在A页面处理过程中,它会依次把几个网站的cookie都发放给用户,cookie都是使用的第一次加密后的字符串,(这个在传的过程中好慢,我机子上都用了好久还打不开),这样不同域名的网站也就同时在客户端存入了cookie,这个时候用户如果从一个网站到另外一个网站也不需要登陆了。作者起的名字叫 天女散花,确实不错。第2种办法叫做后羿射日 就是增加一个跳板B,上面放置超级连结,在A页面处理完cookie验证(只处理一个网站的)后,直接跳转到B页面上,让用户选择登陆哪个站点,如果选择了另外一个网站,在进行cookie的发放。等于让用户选择登陆哪个站点了。
感觉作者的技巧好高,在几个页面间进行跳转的代码也写的不错!
string from = Request["FromUrl"]; //起始 URL 路径
string next = Request["NextUrl"]; //还需要跳转的 URL
string key = Request["CookieTicket"]; //已加密的 Cookie 文本
if(key != null && key !="")
{
System.Web.HttpCookie ck = new HttpCookie(System.Web.Security.FormsAuthentication.FormsCookieName,key);
ck.Path=System.Web.Security.FormsAuthentication.FormsCookiePath;
ck.Expires = System.DateTime.Now.AddYears(100);
Response.Cookies.Add(ck); //将传过来的已加密的身份验证票添加至客房端
string url = next.Split(';')[0]; //从 URL 中拆分出将要跳转的下一张页面
next = next.Replace(url+";",""); //带入下一轮跳转的字串
if(url!="")
{
//跳至下一页面 Response.Redirect(url+"?CookieTicket="+key+"&FromUrl="+from+"&NextUrl="+next);
}
else //已没有下一页面可供跳转
{
Response.Redirect(from); //回到起始页面
}
//页面常量 allLoginUrl 存放所有站点的 AddCookie.aspx 的 URL,注意以 ; 分隔
public const string allLoginUrl =
"http://localhost/FormTest/Public/AddCookie_A.aspx;"
+"http://127.0.0.1/FormTest/Public/AddCookie_B.aspx;"
+"http://My_Computer_Name/FormTest/Public/AddCookie_C.aspx;";
偶已在上面讲述了,如何点击 Login.aspx 中的登录按钮Btn_Login将用户名与密码提交给 LoginTransfer.aspx ,并执行LoginTransfer.aspx 中的Btn_Login_Click 事件。
private void Btn_Login_Click(object sender, System.EventArgs e)
{
string from = Request["FromUrl"]; //起始 URL 路径
string next = this.allLoginUrl;
//由于控件 ID 相同,所以此处得到的是由 Login.aspx 提交过来的用户名与密码
if(this.Txt_LoginName.Text=="Admin"&&this.Txt_Password.Text=="123456")
{
System.Web.Security.FormsAuthenticationTicket tk = new System.Web.Security.FormsAuthenticationTicket(1,"Admin", System.DateTime.Now, System.DateTime.Now.AddYears(100),false,"测试用户数据" );
string key = System.Web.Security.FormsAuthentication.Encrypt(tk); //得到加密后的身份验证票字串
string url = next.Split(';')[0]; //从 URL 中拆分出将要跳转的下一张页面
next = next.Replace(url+";",""); //带入下一轮跳转的字串
Response.Redirect(url+"?CookieTicket="+key+"&FromUrl="+from+"&NextUrl="+next); //跳至下一页面 }
慢慢研究了!