IdentityServer3 - X509Certificate2构造函数错误(“找不到请求的对象”)

时间:2016-08-28 20:19:51

标签: asp.net-mvc identityserver3 x509certificate2

我正在尝试设置IdentityServer3,并且正在使用Pluralsight视频(https://app.pluralsight.com/library/courses/building-securing-restful-api-aspdotnet/table-of-contents)作为参考。我正处于IS3基本设置的时候,我被困在“.UseIdentityServer()”调用的“SigningCertificate”分配中。

我在互联网上的其他地方看到过类似的代码。我的相关代码:

public X509Certificate2 LoadCertificate()
{
     var baseFolder = AppDomain.CurrentDomain.BaseDirectory;
     string certificatePath = $"{baseFolder}Certificates\\idsrv3test.pfx";

     //var certificateBytes = File.ReadAllBytes(certificatePath);

     //return new X509Certificate2(certificateBytes, "idsrv3test", X509KeyStorageFlags.Exportable | X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.UserKeySet | X509KeyStorageFlags.UserProtected);
     return new X509Certificate2(certificatePath, "idsrv3test", X509KeyStorageFlags.Exportable | X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet);
}

public void Configuration(IAppBuilder app)
{
     app.Map("/identity", idSrvApp =>
     {
          idSrvApp.UseIdentityServer(new IdentityServerOptions

               SiteName = "My Identity Server",
               IssuerUri = Constants.IdServerIssuerUri,
               Factory = new IdentityServerServiceFactory()
                    .UseInMemoryUsers(Users.Get())
                    .UseInMemoryClients(Clients.Get())
                    .UseInMemoryScopes(Scopes.Get()),
               SigningCertificate = LoadCertificate()
           });
     });
}

return new X509Certificate2()线正在爆炸。正如您所看到的,我已尝试从路径和字节数组中读取测试证书(从IS3的Github页面下载:https://github.com/IdentityServer/IdentityServer3.Samples/tree/master/source/Certificates)。我还尝试了X509KeyStorageFlags枚举值中的每一个。两者都给出了这个错误:

  

[CryptographicException:找不到请求的对象。 ]
  System.Security.Cryptography.CryptographicException.ThrowCryptographicException(的Int32   hr)+36
  System.Security.Cryptography.X509Certificates.X509Utils._QueryCertFileType(字符串   fileName)+0
  System.Security.Cryptography.X509Certificates.X509Certificate.LoadCertificateFromFile(字符串   fileName,Object password,X509KeyStorageFlags keyStorageFlags)+100
  System.Security.Cryptography.X509Certificates.X509Certificate2..ctor(字符串   fileName,String password,X509KeyStorageFlags keyStorageFlags)+110
  MySecurityService.Startup.LoadCertificate()in   d:\文件\项目\测试\ MySecurityService \ MySecurityService \ Startup.cs:43   UpcarsSecurityService.Startup.b__0_0(IAppBuilder   idSrvApp)in   d:\文件\项目\测试\ MySecurityService \ MySecurityService \ Startup.cs:22   Owin.MapExtensions.Map(IAppBuilder应用程序,PathString pathMatch,Action`1   配置)+178 Owin.MapExtensions.Map(IAppBuilder app,String   pathMatch,Action1配置)+108
  UpcarsSecurityService.Startup.Configuration(IAppBuilder app)中   d:\文件\项目\测试\ MySecurityService \ MySecurityService \ Startup.cs:20

解决方案有一个“Certificates”目录,并且.pfx文件就在那里。在Visual Studio中,我将文件的“复制到输出目录”属性设置为“始终复制”。

我已经花了几个小时在这上面,我真的不知道该怎么做。为了完全清楚,我现在只是通过Visual Studio Debug(IIS Express)在本地计算机上运行它。我计划在完成和部署后在IIS(以及网站)中托管它。我在Windows 10上运行。

非常感谢你的帮助;我很迷失在这里,对IS3来说是全新的。

1 个答案:

答案 0 :(得分:4)

哦,为了f。我使用的.pfx文件是40 KB。正如我所说,这最初是从IS3 Github网站下载的。

但是,当我点击Github上的“idsrv3test.pfx”链接时,我才注意到它是3.32 KB。所以我点击右边的“下载”按钮,果然,在磁盘上它是4 KB。

我用新下载的证书取代了证书,瞧!有用。我无法相信我浪费了太多时间来解决这个问题。嗯......实际上,我可以相信它。典型