国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Asp.Net Form驗證不通過,重復登錄

2019-11-17 01:29:13
字體:
來源:轉載
供稿:網友

asp.net Form驗證不通過,重復登錄

問題產生根源:

當然,其實應該需要保持線上所有機器環境一致!可是,寫了一個小程序。使用的是4.5,aysnc/await實在太好用了,真心不想把代碼修改回去。

so,動了念頭,在這臺服務器上裝個4.5,ms不是說了么,4.5和4.0是高度兼容的。。。。。。

問題現象:

一臺服務器在安裝.net framework 4.5 之后,在該服務器所部署的網站(使用.net framework 4,未修改任何配置,分布式環境),

網站在這臺服務器上登錄之后,打開其他服務器的任何站點,form驗證過不去,導致重復登錄,反之亦然.

問題分析:

為什么會導致重復登錄問題?

很簡單能推斷出是在這個機器上安裝了4.5 ,某些組件的變動,導致form驗證的加解密方式有變動.使得2臺機器生成的登錄cookie內容不一致,不能相互解析.

能影響到.net對form加解密產生不同作用的地方無非2個.

1.本身代碼的bug,兼容性問題問題。

2.配置影響(如web.config中的authentication,machineKey等).

1嘛,基本不可能,ms沒這么渣,那就只能從2下手,但是具體什么配置影響到,就不得而知了.

通過參數配置,如果有改變,那對加解密產生的改變都是相符的. so,我們分析一下加密的方法,找出不同,通過參數來兼容這些修改.那問題就解決了.

form驗證相關的方法,都在System.Web.Security.FormsAuthentication中.

通過調用加密方法在4.5上生成加密字符串,丟到4.0的機器上解密,不通過,提示加密字符串驗證不通過.

so,我們看看加密方法中做了什么

加密方法:

省略部分代碼,剩下的關鍵代碼。

public static string Encrypt(FormsAuthenticationTicket ticket){    return Encrypt(ticket, true);}
internal static string Encrypt(FormsAuthenticationTicket ticket, bool hexEncodedTicket){    byte[] clearData = MakeTicketIntoBinaryBlob(ticket);        if ((_PRotection == FormsProtectionEnum.All) || (_Protection == FormsProtectionEnum.Encryption))        {            clearData = MachineKeySection.EncryptOrDecryptData(true, clearData, null, 0, clearData.Length, false, false, IVType.Random);        }    }    return CryptoUtil.BinaryToHex(clearData);}

然后我們繼續深入到MakeTicketIntoBinaryBlob中查看

private static byte[] MakeTicketIntoBinaryBlob(FormsAuthenticationTicket ticket){    if (!AppSettings.UseLegacyFormsAuthenticationTicketCompatibility)    {        return FormsAuthenticationTicketSerializer.Serialize(ticket);    }  ........................}

對比4,4.5中MakeTicketIntoBinaryBlob方法代碼,發現4.5的源代碼中多了AppSettings.UseLegacyFormsAuthenticationTicketCompatibility這么一個開關配置.

系統默認值為flase,so.在4.5中得到的加密字符串來自FormsAuthenticationTicketSerializer.Serialize(ticket).而4中是在后續代碼中.

so,增加配置<add key="aspnet:UseLegacyFormsAuthenticationTicketCompatibility" value="true" /> 兼容到這部分.

然后,我們繼續看MachineKeySection.EncryptOrDecryptData(true, clearData, null, 0, clearData.Length, false, false, IVType.Random);

internal static byte[] EncryptOrDecryptData(bool fEncrypt, byte[] buf, byte[] modifier, int start, int length, bool useValidationSymAlgo, bool useLegacyMode, IVType ivType){    return EncryptOrDecryptData(fEncrypt, buf, modifier, start, length, useValidationSymAlgo, useLegacyMode, ivType, !AppSettings.UseLegacyEncryption);}

很熟悉,又看到!AppSettings.UseLegacyEncryption開關配置.進入EncryptOrDecryptData方法中能看到這個參數影響到使用不同的加密方式.

同上,增加配置<add key="aspnet:UseLegacyEncryption" value="true" />兼容到這部分.

再次調用Encrypt方法生成加密字符串,丟到4.0機器上.哇,能解密成功了.

當然,實際解決起來,走了不少彎路,周五晚上發現問題,查了一晚上,未果,但是有思路了.后又周一查了2個小時,終于搞定這個問題.

相關說明:

有關安全更新 2638420 的部署指南,請參見 MS11-100

如何配置 ASP.NET 中的舊加密模式

看了上面一個,好傻...如果發現問題的時候,之后搜索asp.net 舊加密方式. 馬上解決...


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 黄陵县| 彭山县| 岳普湖县| 奉化市| 云龙县| 涟水县| 都江堰市| 吐鲁番市| 蒙山县| 郸城县| 新巴尔虎左旗| 大丰市| 遂宁市| 砀山县| 隆化县| 河曲县| 乌拉特中旗| 常宁市| 嘉义县| 大方县| 汉沽区| 裕民县| 巴青县| 利辛县| 华宁县| 固阳县| 莆田市| 色达县| 泰宁县| 临城县| 扎赉特旗| 西乌| 定南县| 枣庄市| 抚远县| 临潭县| 华安县| 洱源县| 塔城市| 东丰县| 博兴县|