對MachineKey進行配置,以便將其用於對 Forms 身份驗證 Cookie 數據和視圖狀態數據進行加密和解密,並將其用於對進程外會話狀態標識進行驗證。本次講的是如何獲取IIS自動給應用惟一輩子成的MachineKey和手動生成的MachineKey,下面2種方式都適合,可是有必定區別可選擇使用。html
通常狀況下是不容許獲取MachineKey(手動生成的KEY不在此範疇,直接複製便可,本次獲取的是IIS自動生成的,而且是歷史項目【代碼生成】,通常有由 FormsAuthentication 或者 System.Web.Security.MachineKey 等等其餘相關操做類來進行獲取來進行相關操做的加密,自己微軟封裝MachineKey時就是internal的 訪問級別,不建議獲取。web
嘗試了不少方式,APPCMD命令獲取,WMI獲取,等等,最後不得不編碼實現,若有其餘方式,請回復賜教,本次獲取只能使用反射進行操做。數組
方式一:分佈式
private string ConvertToHex(byte[] binary) { return binary.Aggregate( new StringBuilder(), (acc, c) => acc.AppendFormat("{0:x2}", c), acc => acc.ToString()); } string key = "", iv = ""; public void GetMachineKey() { System.Web.Configuration.MachineKeySection section = (System.Web.Configuration.MachineKeySection) ConfigurationManager.GetSection("system.web/machineKey"); System.Reflection.BindingFlags flags = System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.GetProperty; Func<string, byte[]> propertyReader = name => (byte[])section .GetType() .GetProperty(name, flags) .GetValue(section, null); key = ConvertToHex(propertyReader("DecryptionKeyInternal")); iv = ConvertToHex(propertyReader("ValidationKeyInternal"));}
這種方式的缺點是,只能在第一次初始化時獲取,第二次進行獲取的時候,所有是00000000000000000000000000的字節數組ui
方式二:編碼
Configuration config = WebConfigurationManager.OpenWebConfiguration("/"); MachineKeySection machineKeySection = (MachineKeySection)config.GetSection("system.web/machineKey"); PropertyInfo validata = ty.GetProperty("ValidationKeyInternal", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetProperty); PropertyInfo desc = ty.GetProperty("DecryptionKeyInternal", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetProperty); byte[] valiValue = (byte[])validata.GetValue(machineKeySection); byte[] descValue = (byte[])desc.GetValue(machineKeySection); string valiStr = null; foreach (var item in valiValue) { valiStr += string.Format("{0:x2}", item); } string descStr = null; foreach (var item in descValue) { descStr += string.Format("{0:x2}", item); }
該方式惟一不一樣的就是,把獲取配置的方式修改爲了【WebConfigurationManager】來進行操做,這樣任何頁面和調用均可以獲取到。加密
這樣,若是有舊項目須要SSO集成分佈式開發,又不但願中止服務,能夠直接獲取到值後進行配置修改。spa