MachineKey其用於對 Forms 身份驗證 Cookie 數據和視圖狀態數據進行加密和解密,一般情況下IIS自動默認給網站或者每一個應用生成唯一的MachineKey,當然您也可以手動生成的MachineKey,一般有由 FormsAuthentication 操作類來進行操作。
SSO:英文全稱Single Sign On,單點登錄,SSO是在多個應用系統中,用戶只需要登錄一次就可以訪問所有相互信任的應用系統。它包括可以將這次主要的登錄映射到其他應用中用於同一個用戶的登錄的機制。
A:在虛擬主機上,不同站長的站點都在同一台機器上,默認情況,machinekey是相同的,使用FormsAuthentication就有一點風險,有時為了安全,通常可以使用自己生成隨機的machineKey,這樣就避免了這個問題。
B:為了負載平衡,一個站點的不同內容放到不同的機器,這樣默認情況,machineKey是不同的,但是邏輯上這些都是同一站點,為了實現多個機器共用同一登入,這時就要配置相同的machineKey。
using System.Web.Configuration; //打開web.config文件,寫入新生成的machineKey Configuration config = WebConfigurationManager.OpenWebConfiguration("/"); MachineKeySection configSection = (MachineKeySection)config.GetSection("system.web/machineKey"); configSection.ValidationKey = CreateKey(64); configSection.DecryptionKey = CreateKey(24); configSection.Validation = MachineKeyValidation.SHA1; if (!configSection.SectionInformation.IsLocked) { config.Save(); }
using System.Security.Cryptography; //生成隨機Key public static string CreateKey(int numBytes) { RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider(); byte[] buff = new byte[numBytes]; rng.GetBytes(buff); System.Text.StringBuilder hexString = new System.Text.StringBuilder(64); for (int i = 0; i < buff.Length; i++) { hexString.Append(String.Format("{0:X2}", buff[i])); } return hexString.ToString(); }
結果web.config輸出
<machineKey validationKey="3FF1E929BC0534950B0920A7B59FA698BD02DFE8" decryptionKey="280450BB36319B474C996B506A95AEDF9B51211B1D2B7A77" decryption="3DES" validation="SHA1"/>
具體配置請參考MSDN:地址
https://technet.microsoft.com/zh-cn/subscriptions/w8h3skw9(v=vs.80).aspx
如果你的Asp.Net程序執行時碰到這種錯誤:"驗證視圖狀態 MAC 失敗。如果此應用程序由網絡場或群集承載,請確保 <machineKey> 配置指定了相同的 validationKey 和驗證算法,不能在群集中使用 AutoGenerate。”那么說明你沒有讓你的應用程序使用統一的machineKey,那么machineKey的作用是什么呢?按照MSDN的標准說法:“對密鑰進行配置,以 便將其用於對 Forms 身份驗證 Cookie 數據和視圖狀態數據進行加密和解密,並將其用於對進程外會話狀態標識進行驗證。”也就是說Asp.Net的很多加密,都是依賴於machineKey里面 的值,例如Forms 身份驗證 Cookie、ViewState的加密。默認情況下,Asp.Net的配置是自己動態生成,如果單台服務器當然沒問題,但是如果多台服務器負載均 衡,machineKey還采用動態生成的方式,每台服務器上的machinekey值不一致,就導致加密出來的結果也不一致,不能共享驗證和 ViewState,所以對於多台服務器負載均衡的情況,一定要在每台站點配置相同的machineKey。