由 appsettings.json 标识的 Kestrel Https 证书仅在以管理员模式运行时发现

use*_*915 5 https kestrel-http-server asp.net-core

我正在使用 appsettings.json 在 .netcore3.1 应用程序中配置 Kestrel。这是 appsettings.json 中的相关部分

    "Kestrel": {
    "Certificates": {
      "Default": {
        "Subject": "certificate name",
        "Store": "MY",
        "Location": "LocalMachine",
        "AllowInvalid": true
      }
    }
  },
  "AllowedHosts": "*",
  "Urls": "http://*:5010;https://*:5011"
Run Code Online (Sandbox Code Playgroud)

如果我启动应用程序,它会出现在两个端口上。但是,通过 HTTPS 访问它会将此异常转储到我的应用程序的控制台

Microsoft.AspNetCore.Server.Kestrel[0] 处理 0HLT41KHBJ13T 时未处理的异常。System.ComponentModel.Win32Exception (0x8009030D): System.Net.SSPIWrapper.AcquireCredentialsHandle(SSPIInterface secModule, String package, CredentialUse intent, SCHANNEL_CRED scc) 无法识别提供给包的凭据

但是,如果我以管理权限启动应用程序,它就可以工作。因此,证书很好(它具有所需的私钥),但仍然无法正常工作。只是为了好玩,我将证书导入到 LocalUser 存储中,即使没有管理员权限,应用程序也绝对可以访问该存储,但没有任何乐趣。

如果没有以管理权限运行,有什么想法会导致此失败?您可以看到证书位于证书存储中,而不是文件系统中,这排除了文件权限问题。

Ant*_*oth 7

请注意这一点;用户也需要权限才能读取证书,就像读取文件一样。通常,SYSTEM帐户默认具有读取权限,但开发人员不具有对本地计算机存储中的证书的读取权限,除非他们是具有该权限的特权组的成员。

您可以进入证书存储并添加权限。

打开商店,右键单击证书。选择“所有任务” | “管理私钥”,添加用户读取权限,就像在资源管理器中添加文件权限一样。您还可以创建一个开发人员组,并以这种方式授予和撤销对开发人员证书的权限,只需直接管理一次证书权限。