ASP.NETmachinekeysetkeyincode对于一个托管在IIS上的ASP.NETMVC4网站,我想在运行时动态调整代码中的machinekey。机器密钥、加密和身份验证密钥以及要使用的算法都存储在数据库中。我想在应用程序启动时注入这些值,而不是从web.config文件中读取值,而是让系统使用它们。有没有办法在不必更改web.config(仅更改内存配置)的情况下实现此目的?我已经尝试访问配置部分,但它被标记为只读并且也是密封的,所以我无法覆盖IsReadOnly()。但是,在我看来,拥有一个setter表明可能有一种方法可以删除只读标志。varconfigSection=(MachineKeySection)ConfigurationManager.GetSection("system.web/machineKey");如果(!configSection.IsReadOnly()){configSection.ValidationKey=_platformInfo.MachineKey.ValidationKey;configSection.DecryptionKey=_platformInfo.MachineKey.EncryptionKey;...}有没有办法做到这一点?我能看到的唯一选择是使用像AppHarbor这样的自定义方法,但如果可能的话,我宁愿坚持使用内置方法。如果有人问我为什么要这样做,原因是,这是针对在网络场中运行的大量相同网站。因此,您必须有一个非自动生成的密钥(每个服务器上必须相同)。此外,每个网站都应该是独立的,不应共享相同的密钥。由于所有站点都具有相同的物理表示,因此它们共享相同的物理位置。这就是为什么web.config文件不能包含特定于应用程序的设置的原因。编辑:至少确认这是否根本不可能是非常有帮助的。如上所述,可以使用自定义身份验证和加密方法,从而完全避免设置机器密钥。谢谢。这不能在Web应用程序启动后以编程方式设置。但是,仍然有可能实现您的目标。如果每个应用程序都在自己的应用程序池中运行,并且每个应用程序池都有自己的标识,请检查applicationHost.config中的CLRConfigFile开关。您可以使用每个应用程序池来注入新级别的配置。有关如何使用它的示例,请参阅http://weblogs.asp.net/owscott/archive/2011/12/01/setting-an-aspnet-config-file-per-application-pool.aspx。您可以在每个应用程序池的自定义CLR配置文件中设置一个明确且唯一的元素。这与Azure网站、GoDaddy和其他需要在每个应用程序基础上设置默认显式机器密钥的主机使用的机制相同。请记住为每个将访问它的应用程序池适当地对每个目标.config文件进行ACL。很丑,不过我可以用反射暂时去掉config部分的只读位,设置key,然后恢复:以上是C#学习教程:ASP.NETmachinekey在代码中设置key吧正在使用,需要多了解C#学习教程,希望大家多多关注——vargetter=typeof(MachineKeySection).GetMethod("GetApplicationConfig",BindingFlags.Static|BindingFlags.NonPublic);varconfig=(MachineKeySection)getter.Invoke(null,Array.Empty());varreadOnlyField=typeof(ConfigurationElement).GetField("_bReadOnly",BindingFlags.Instance|BindingFlags.NonPublic);readOnlyField.SetValue(config,false);config.DecryptionKey=myKeys.EncryptionKey;配置.ValidationKey=myKeys.ValidationKey;readOnlyField.SetValue(config,true);本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
