Registry.LocalMachine返回null

时间:2017-10-08 10:48:25

标签: c# asp.net asp.net-core asp.net-identity identityserver4

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

我正按照documentation使用以下代码配置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委托中的Asp.Net核心标识中的RegistryPolicyResolver中出现空引用异常,特别是在读取注册表项时:

_getPolicyRegKey = () => Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\DotNetPackages\Microsoft.AspNetCore.DataProtection");

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

有没有办法让Registry.LocalMachine返回正确的值,或者,最好是否有任何方法可以一起使用注册表覆盖或关闭?

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

1 个答案:

答案 0 :(得分:0)

根据documentation

  

警告

     

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

this doc说:

  

注意

     

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

我不能肯定地说这是你遇到的问题(看起来更像是你发现了一个错误),但是文档中的规定解决方案(至少对于第一个问题)是使用其中一个{ {1}}方法:

ProtectKeysWith*

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