.net Forms身份验证不能用在应用的分布式部署中吗?
參照網(wǎng)上的一些方法,使用Forms身份驗(yàn)證對(duì)應(yīng)用進(jìn)行分布式部署,發(fā)現(xiàn)沒有成功。
應(yīng)用部署的兩臺(tái)內(nèi)網(wǎng)服務(wù)器:192.168.1.19,192.168.1.87,使用Nginx做負(fù)載分配,配置完全相同;每臺(tái)都可以登錄運(yùn)行。
<system.web><!--配置 ASP.NET 使用的安全身份驗(yàn)證模式,以標(biāo)識(shí)傳入的用戶。domain=".zt-express.com" --><authentication mode="Forms"><forms name=".GDZDAUTHENFORMS" loginUrl="~/Login.aspx" timeout="2880" defaultUrl="~/Main.aspx" path="/" protection="All" /></authentication><machineKey validationKey="E804106B394DE7148524A5FB0E7E282F05C3BB98553931F2B3FCDC896473390205326A876AA5490050D795FA181604651878B4285475150437A73F9D705E412A" decryptionKey="9BE9F489677A8285D6A00E902857ABB2986C73534FF2A901" validation="SHA1" /><authorization><allow users="*" /></authorization><anonymousIdentification enabled="true" cookieName=".GDZDanonymous" /><httpRuntime /><compilation debug="true" targetFramework="4.0" /><pages enableSessionState="true" controlRenderingCompatibilityVersion="4.0" /><customErrors mode="Off" /><sessionState timeout="3600"></sessionState></system.web>以下時(shí)登錄成功后的處理
/// <summary>/// 創(chuàng)建一個(gè)票據(jù),放在cookie中/// 票據(jù)中的數(shù)據(jù)經(jīng)過加密,解決一下cookie的安全問題。/// </summary>/// <param name="userInfo">登錄用戶</param>/// <param name="issueDateTime">發(fā)布時(shí)間</param>/// <param name="experation">過期時(shí)間</param>/// <param name="isPersistent">持久性</param>public static void SetCookie(BaseUserInfo userInfo, DateTime? issueDateTime = null, DateTime? experation = null, bool isPersistent = true){if (issueDateTime == null){issueDateTime = DateTime.Now;}if (experation == null){//設(shè)置COOKIE過期時(shí)間experation = DateTime.Now.AddHours(SystemInfo.UserLoginExperation);}BaseSystemInfo.UserInfo = userInfo;BaseSystemInfo.UserInfo.ServicePassword = BaseSystemInfo.ServicePassword;BaseSystemInfo.UserInfo.ServiceUserName = BaseSystemInfo.ServiceUserName;BaseSystemInfo.UserInfo.SystemCode = BaseSystemInfo.SystemCode;JavaScriptSerializer javaScriptSerializer = new JavaScriptSerializer();string userData = javaScriptSerializer.Serialize(BaseSystemInfo.UserInfo);//生成驗(yàn)證票據(jù),其中包括用戶名、生效時(shí)間、過期時(shí)間、是否永久保存和用戶數(shù)據(jù)等。FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, userInfo.NickName, (DateTime)issueDateTime, (DateTime)experation, isPersistent, userData, FormsAuthentication.FormsCookiePath);HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, FormsAuthentication.Encrypt(ticket));cookie.Expires = (DateTime)experation;HttpResponse response = HttpContext.Current.Response;//指定客戶端腳本是否可以訪問[默認(rèn)為false]cookie.HttpOnly = true;//指定統(tǒng)一的Path,比便能通存通取cookie.Path = "/";response.AppendCookie(cookie);//移除一下權(quán)限緩存數(shù)據(jù) 以便重新獲取緩存數(shù)據(jù) RemoveRedisCache(userInfo);}以下是驗(yàn)證的代碼
//測(cè)試 HttpContext.Current.User.Identity.IsAuthenticated在分布式部署中是否有效Response.Write(string.Format("測(cè)試 HttpContext.Current.User.Identity.IsAuthenticated在分布式部署中是否有效IsAuthenticated:{0}", HttpContext.Current.User.Identity.IsAuthenticated));Response.Write("<br/>cookie輸出開始=============================");foreach (string cookieName in Request.Cookies){var mycookie = Request.Cookies[cookieName];if (mycookie != null){Response.Write("<br/>" + cookieName + "中含有" + mycookie.Values.Count + "個(gè)Key");if (mycookie.Values.Count > 0){foreach (string s in mycookie.Values){Response.Write("<br/> “" + s + "”=" + mycookie[s].ToString() + ";");}}}}Response.Write("<br/>cookie輸出完畢=============================");Response.Write("<br/>FormsCookieName=" + FormsAuthentication.FormsCookieName);HttpCookie authCookie = HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName];if (authCookie != null){FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value);if (authTicket != null){string userData = authTicket.UserData;JavaScriptSerializer javaScriptSerializer = new JavaScriptSerializer();var userInfo = javaScriptSerializer.Deserialize<BaseUserInfo>(userData);Response.Write("<br/>NickName=" + userInfo.NickName);}else{Response.Write("<br/>authTicket = null");}}else{Response.Write("<br/>authCookie = null");}Response.Write("<br/>ClientIpAddress = " + UserInRedis.GetCurrentIpAddress(HttpContext.Current));Response.Write("<br/>ServerIpAddress = " + Request.ServerVariables.Get("Local_Addr"));部署完畢,登錄系統(tǒng)后,訪問測(cè)試頁面
?
可以看到當(dāng)前訪問應(yīng)用被分配到192.168.1.19上了
現(xiàn)在把192.168.1.19的應(yīng)用停掉,再來訪問測(cè)試頁面
從上面可以看出,訪問被分配到192.168.1.87上了,而用于認(rèn)證的.GDZDAUTHENFORMS cookie沒有傳過來,其它的cookie傳過來了。
這是什么原因呢?同樣的域名應(yīng)該說cookie會(huì)傳到后臺(tái)的啊。
參考:http://www.cnblogs.com/fish-li/archive/2012/04/15/2450571.html等文章還是沒實(shí)現(xiàn),服務(wù)器配置是一樣的,按理說,同樣的域名,訪問時(shí)應(yīng)該把cookie都帶過去的啊。
?同樣的訪問請(qǐng)求,應(yīng)該說每次都會(huì)帶cookie的,為何在分布式部署中,指向另外一臺(tái)機(jī)子時(shí),cookie獲取不到
?
此問題已發(fā)到msdn:https://social.msdn.microsoft.com/Forums/vstudio/zh-CN/f666f1d1-3d9e-4620-babb-1eea9302c0d9/forms?forum=295
總結(jié)
以上是生活随笔為你收集整理的.net Forms身份验证不能用在应用的分布式部署中吗?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Tomcat 8熵池阻塞变慢详解
- 下一篇: 动态规划之 0-1背包问题及改进