问题描述
如题公司服务器升级,从win2003,IIS6升级到win2008,IIS7.5升级后发现登陆后的cookie值不一致,2008的要比2003的值要长。导致其他java系统对接单点登陆出现解析cookie错误。问题:iis7已经启用父路径,应用程序按照32位运行也是true;这个升级还需要配置些什么吗?解决后会有100分的额外奖励!!!!!附cookie值之前是win2003、iis6,用这个方法得到的cookie.value是【6AEEA3F7F7D7EE4EDA843EF3C92F22860D726CD7200782DAD892450A07F0CFEEC6F4CD5CC3878CABB78B0DE7D204836446077F9F7B9AB8E0C15F162E9F840518A02CC79DF330EFEA528B8A8C7ABDF412】这个string长度是160迁移到win2008、iis7后,同样的程序,得到的cookie.value是【3551E79BBF862281BD870996432B27474425C2E3DED4E309663D8D20840BA15B793EFFC24493D72F1D441A95B89D179E9BBFFB16D733D82FA3723EE498DD4B48A1046527FA3381AA1D383AECA62C0200FF6558926BDE7FCD20C6D1F8F4FFB45EF288594C7D728F1411DD5226286E2C6500000000】这个string长度是232
解决方案
解决方案二:
自顶,求助啊,
解决方案三:
MD5加的密,各位大大,冰天雪地跪求呀!!真心搞不定
解决方案四:
FormsAuthentication.SetAuthCookie("usrname",true);
这方法生成的cookie.value本来就是不定长的,会随username变化,2位的userName是160长,怀疑你是不是用不同的账号测了?如果程序相同账号相同,手上没IIS6只能帮顶了.
解决方案五:
感谢回复程序和账号确实相同。就只有环境不一样。win2003iis6和win2008iis7加密后的结果和username长短无关。无论多长在2003中也是160位,2008也是232位username是当前登录的账号。
解决方案六:
自己再次顶呀
解决方案七:
注意事项,参考
解决方案八:
是否与.netframework的版本有关,换一个高版本的试试、
解决方案九:
如果你希望保持一致,需要自己写一个MembershipProvider,自己重载SetAuthCookie。那么你想怎么做就你决定了。googlecustomMembershipProvider
解决方案十:
引用6楼wangnaisheng的回复:
注意事项,参考
忘记说了我们这个项目用的是forms表单类型。不是windows引用7楼wangnaisheng的回复:
是否与.netframework的版本有关,换一个高版本的试试、
win2003里面安装了.net2.0、3.0、3.5。win2008里面安装的是系统自带的.net3.5.1过会儿我在win2008里面装下win2003的这几个个环境试试。引用8楼devmiao的回复:
如果你希望保持一致,需要自己写一个MembershipProvider,自己重载SetAuthCookie。那么你想怎么做就你决定了。googlecustomMembershipProvider
恩这个兴许是闭源项目的缺点,不能由自己控制。这个项目我是临时接的,单点登录采用这种方式是之前搞的。而且接这个登录系统的其他系统,好多。不可能去再自己重新写一个。
解决方案十一:
我再次顶顶顶顶
解决方案十二:
看源码到这里,感觉不容易解决啊privatestaticHttpCookieGetAuthCookie(stringuserName,boolcreatePersistentCookie,stringstrCookiePath,boolhexEncodedTicket){Initialize();if(userName==null){userName=string.Empty;}if((strCookiePath==null)||(strCookiePath.Length<1)){strCookiePath=FormsCookiePath;}DateTimeutcNow=DateTime.UtcNow;DateTimeexpirationUtc=utcNow.AddMinutes((double)_Timeout);FormsAuthenticationTicketticket=FormsAuthenticationTicket.FromUtc(2,userName,utcNow,expirationUtc,createPersistentCookie,string.Empty,strCookiePath);stringstr=Encrypt(ticket,hexEncodedTicket);if((str==null)||(str.Length<1)){thrownewHttpException(SR.GetString("Unable_to_encrypt_cookie_ticket"));}HttpCookiecookie=newHttpCookie(FormsCookieName,str);cookie.HttpOnly=true;cookie.Path=strCookiePath;cookie.Secure=_RequireSSL;if(_CookieDomain!=null){cookie.Domain=_CookieDomain;}if(ticket.IsPersistent){cookie.Expires=ticket.Expiration;}returncookie;}
解决方案十三:
上面是4.0的代码
解决方案十四:
引用12楼findcaiyzh的回复:
上面是4.0的代码
为什么感觉不容易解决呢?之前做过将win2003中的system.web替换到win2008中的system.web,但是没有起到效用。帮忙看看,我替换的对不。C:WindowsMicrosoft.NETFrameworkv2.0.50727system.web.dll替换到2008的C:WindowsMicrosoft.NETFrameworkv2.0.50727system.web.dllC:WindowsMicrosoft.NETFramework64v2.0.50727system.web.dll
解决方案十五:
自己再顶大神们都帮帮忙吧
其他方案:
FormsAuthentication.SetAuthCookie(userName,true);默认采用最新版本的验证数据和加密方式可改为指定版本,手动设置cookie,FormsAuthenticationTicketauthTicket=newFormsAuthenticationTicket(1,//versionuserName,DateTime.Now,DateTime.Now.AddMinutes(30),false,"admins,users,xxx");stringencryptedTicket=FormsAuthentication.Encrypt(authTicket);System.Web.HttpCookieauthCookie=newSystem.Web.HttpCookie(FormsAuthentication.FormsCookieName,encryptedTicket);System.Web.HttpContext.Current.Response.Cookies.Add(authCookie);