Registry.LocalMachine returns null



我正在使用 ASP.Net Core 2 Identity和Identity Server 4来管理我的应用程序的用户和登录。

我正在根据文档使用以下代码配置 Kestrel 托管的身份服务器:

var host = new WebHostBuilder().UseKestrel()
                   .UseUrls("http://localhost:44333")
                   .UseStartup<IdentityStartup>();
host.Build().Start();

IdentityStartup包含以下 ASP.Net 核心标识的设置:

services.AddIdentity<UserAccount, Role>()
            .AddEngineEntityFrameworkStores<IdentityDBContext>();
services.AddDataProtection().PersistKeysToFileSystem(new DirectoryInfo(@"D:"));

当 Web 主机运行时,我在_getPolicyRegKey委托中的核心标识中RegistryPolicyResolver收到空引用异常 Asp.Net 特别是当使用以下命令读取注册表项时:

_getPolicyRegKey = () => Registry.LocalMachine.OpenSubKey(@"SOFTWAREMicrosoftDotNetPackagesMicrosoft.AspNetCore.DataProtection");

通过下载Microsoft符号,我可以看到Registry.LocalMachine返回 null,在此行上给出异常。

有没有办法让Registry.LocalMachine返回正确的值,或者最好是,有没有办法一起覆盖或关闭注册表?

我注意到IRegistryPolicyResolver是内部的,所以我可以添加我自己的版本,DataProtectionServiceCollectionExtensions中的AddDataProtectionServices是私有的并且总是被调用,所以我不能覆盖它

根据文档:

警告

如果更改密钥暂留位置,系统将不再自动加密静态密钥,因为它不知道 DPAPI 是否是合适的加密机制。

这个文档说:

注意

如果指定显式密钥静态加密机制,数据保护系统将取消注册启发式提供的默认密钥存储机制。您必须指定显式密钥存储机制,否则数据保护系统将无法启动。

我不能确定这是您遇到的问题(似乎更像是您发现了一个错误),但是文档中规定的解决方案(至少对于第一个问题)是使用ProtectKeysWith*方法之一:

services.AddDataProtection()
    .PersistKeysToFileSystem(new DirectoryInfo(@"D:"))
    // searches the cert store for the cert with this thumbprint
    .ProtectKeysWithCertificate("3BCE558E2AD3E0E34A7743EAB5AEA2A9BD2575A0");

services.AddDataProtection()
    .PersistKeysToFileSystem(new DirectoryInfo(@"D:"))
    // all user accounts on the machine can decrypt the keys
    .ProtectKeysWithDpapi(protectToLocalMachine: true);

相关内容

  • 没有找到相关文章

最新更新