gpt4 book ai didi

c# - ASP.NET machinekey 在代码中设置键

转载 作者:太空狗 更新时间:2023-10-29 20:04:49 26 4
gpt4 key购买 nike

对于 IIS 托管的 ASP.NET MVC 4 网站,我想在运行时在代码中动态调整机器 key 。

机器 key 、加密和验证 key 以及要使用的算法都存储在数据库中。我不想从 web.config 文件中读取值,而是想在应用程序启动期间注入(inject)这些值并让系统使用它们。

有什么方法可以做到这一点而无需更改 web.config(只更改内存配置)?

我已经尝试访问配置部分,但它被标记为只读并且也是密封的,所以我无法覆盖 IsReadOnly()。但是,有一个 setter 对我来说是一个指示器,表明可能有一种方法可以潜在地删除只读标志。

var configSection = (MachineKeySection)ConfigurationManager.GetSection("system.web/machineKey");
if (!configSection.IsReadOnly())
{
configSection.ValidationKey = _platformInfo.MachineKey.ValidationKey;
configSection.DecryptionKey = _platformInfo.MachineKey.EncryptionKey;
...
}

有什么办法可以实现吗?我能看到的唯一选择是使用像 AppHarbor 这样的自定义方法,但是如果可能的话,我宁愿坚持使用内置方法。

万一有人问我为什么要这样做,原因是,这是针对在网络场中运行的大量相同网站。因此,必须具有非自动生成的 key (每个服务器上必须相同)。此外,每个网站都应该是独立的,不应共享相同的 key 。由于所有网站的物理表示都相同,因此它们共享相同的物理位置。这就是 web.config 文件不能包含应用程序特定设置的原因。

编辑:如果根本不可能,至少确认一下会很有帮助。如前所述,可以使用自定义身份验证和加密方法,从而完全避免使用机器 key 设置。谢谢。

最佳答案

这很丑陋,但我能够使用反射暂时从配置部分删除只读位,设置 key ,然后恢复它:

var getter = typeof(MachineKeySection).GetMethod("GetApplicationConfig", BindingFlags.Static | BindingFlags.NonPublic);
var config = (MachineKeySection)getter.Invoke(null, Array.Empty<object>());

var readOnlyField = typeof(ConfigurationElement).GetField("_bReadOnly", BindingFlags.Instance | BindingFlags.NonPublic);
readOnlyField.SetValue(config, false);

config.DecryptionKey = myKeys.EncryptionKey;
config.ValidationKey = myKeys.ValidationKey;

readOnlyField.SetValue(config, true);

关于c# - ASP.NET machinekey 在代码中设置键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18446385/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com