MachineKey 操做 之 應用集羣中SSO應用生成MachineKey

MachineKey介紹

   MachineKey其用於對 Forms 身份驗證 Cookie 數據和視圖狀態數據進行加密和解密,通常狀況下IIS自動默認給網站或者每個應用生成惟一的MachineKey,固然您也能夠手動生成的MachineKey,通常有由 FormsAuthentication 操做類來進行操做。web

 

應用集羣,SSO單點登陸

  SSO:英文全稱Single Sign On,單點登陸,SSO是在多個應用系統中,用戶只須要登陸一次就能夠訪問全部相互信任的應用系統。它包括能夠將此次主要的登陸映射到其餘應用中用於同一個用戶的登陸的機制。算法

A:在虛擬主機上,不一樣站長的站點都在同一臺機器上,默認狀況,machinekey是相同的,使用FormsAuthentication就有一點風險,有時爲了安全,一般可使用本身生成隨機的machineKey,這樣就避免了這個問題。安全

B:爲了負載平衡,一個站點的不一樣內容放到不一樣的機器,這樣默認狀況,machineKey是不一樣的,可是邏輯上這些都是同一站點,爲了實現多個機器共用同一登入,這時就要配置相同的machineKey。服務器

代碼生成machineKey示例,固然您也可使用IIS生成後複製到個個子系統中繼續配置
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"/>

 

如何配置machineKey

具體配置請參考MSDN:地址負載均衡

 https://technet.microsoft.com/zh-cn/subscriptions/w8h3skw9(v=vs.80).aspxide

 

注意事項

  若是你的Asp.Net程序執行時碰到這種錯誤:"驗證視圖狀態 MAC 失敗。若是此應用程序由網絡場或羣集承載,請確保 <machineKey> 配置指定了相同的 validationKey 和驗證算法,不能在羣集中使用 AutoGenerate。」那麼說明你沒有讓你的應用程序使用統一的machineKey,那麼machineKey的做用是什麼呢?按照MSDN的標準說法:「對密鑰進行配置,以 便將其用於對 Forms 身份驗證 Cookie 數據和視圖狀態數據進行加密和解密,並將其用於對進程外會話狀態標識進行驗證。」也就是說Asp.Net的不少加密,都是依賴於machineKey裏面 的值,例如Forms 身份驗證 Cookie、ViewState的加密。默認狀況下,Asp.Net的配置是本身動態生成,若是單臺服務器固然沒問題,可是若是多臺服務器負載均 衡,machineKey還採用動態生成的方式,每臺服務器上的machinekey值不一致,就致使加密出來的結果也不一致,不能共享驗證和 ViewState,因此對於多臺服務器負載均衡的狀況,必定要在每臺站點配置相同的machineKey。網站

相關文章
相關標籤/搜索