ASP.NET machineKey的作用和使用方法
ASP.NET machineKey的作用
如果你的Asp.Net程序執(zhí)行時碰到這種錯誤:“驗證視圖狀態(tài) MAC 失敗。如果此應(yīng)用程序由網(wǎng)絡(luò)場或群集承載,請確保 <machineKey> 配置指定了相同的 validationKey 和驗證算法。不能在群集中使用 AutoGenerate?!蹦敲凑f明你沒有讓你的應(yīng)用程序使用統(tǒng)一的machineKey,那么machineKey的作用是什么呢?按照MSDN的標(biāo)準(zhǔn)說法:“對密鑰進行配置,以便將其用于對 Forms 身份驗證 Cookie 數(shù)據(jù)和視圖狀態(tài)數(shù)據(jù)進行加密和解密,并將其用于對進程外會話狀態(tài)標(biāo)識進行驗證?!币簿褪钦fAsp.Net的很多加密,都是依賴于machineKey里面的值,例如Forms 身份驗證 Cookie、ViewState的加密。默認(rèn)情況下,Asp.Net的配置是自己動態(tài)生成,如果單臺服務(wù)器當(dāng)然沒問題,但是如果多臺服務(wù)器負(fù)載均衡,machineKey還采用動態(tài)生成的方式,每臺服務(wù)器上的machinekey值不一致,就導(dǎo)致加密出來的結(jié)果也不一致,不能共享驗證和ViewState,所以對于多臺服務(wù)器負(fù)載均衡的情況,一定要在每臺站點配置相同的machineKey。
ASP.NET machineKey生成的算法:
- validationKey = CreateKey(20);
- decryptionKey = CreateKey(24);
- protected string CreateKey(int len)
- {
- byte[] bytes = new byte[len];
- new RNGCryptoServiceProvider().GetBytes(bytes);
- StringBuilder sb = new StringBuilder();
- for(int i = 0; i < bytes.Length; i++)
- {
- sb.Append(string.Format("{0:X2}",bytes[i]));
- }
- return sb.ToString();
- }
附參考的ASP.NET machineKey配置:
- <?xml version="1.0"?>
- <configuration>
- <system.web>
- <machineKey validationKey="3FF1E929BC0534950B0920A7B59FA698BD02DFE8" decryptionKey="280450BB36319B474C996B506A95AEDF9B51211B1D2B7A77" decryption="3DES" validation="SHA1"/>
- </system.web>
- </configuration>
【編輯推薦】