MachineKey其用于对 Forms 身份验证 Cookie 数据和视图状态数据进行加密和解密,通常状况下IIS自动默认给网站或者每个应用生成惟一的MachineKey,固然您也能够手动生成的MachineKey,通常有由 FormsAuthentication 操做类来进行操做。web
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).aspxide
若是你的Asp.Net程序执行时碰到这种错误:"验证视图状态 MAC 失败。若是此应用程序由网络场或群集承载,请确保 <machineKey> 配置指定了相同的 validationKey 和验证算法,不能在群集中使用 AutoGenerate。”那么说明你没有让你的应用程序使用统一的machineKey,那么machineKey的做用是什么呢?按照MSDN的标准说法:“对密钥进行配置,以 便将其用于对 Forms 身份验证 Cookie 数据和视图状态数据进行加密和解密,并将其用于对进程外会话状态标识进行验证。”也就是说Asp.Net的不少加密,都是依赖于machineKey里面 的值,例如Forms 身份验证 Cookie、ViewState的加密。默认状况下,Asp.Net的配置是本身动态生成,若是单台服务器固然没问题,可是若是多台服务器负载均 衡,machineKey还采用动态生成的方式,每台服务器上的machinekey值不一致,就致使加密出来的结果也不一致,不能共享验证和 ViewState,因此对于多台服务器负载均衡的状况,必定要在每台站点配置相同的machineKey。网站