如何在运行于IIS的ASP.NET Core应用程序的appsettings.json中配置IdentityServer的关键设置

21

我使用以下命令创建了支持授权的 Angular / ASP.NET Core 模板:

dotnet new angular --auth Individual

这是一个:

  • 具有ASP.NET Core Identity用于认证和存储用户的ASP.NET Core 3.0应用程序,
  • 使用IdentityServer4实现Open ID Connect,
  • Angular单页应用程序,

所有预配置以协同工作。

在部署此模板应用程序之前,我首先尝试将此模板应用程序部署到IIS中。

我已将应用程序部署到IIS中,并设置了数据库并使应用程序成功连接,但我卡住了。 我不确定如何创建和配置用于签名令牌的生产证书。

Microsoft文档中的这一点上简要提到了“用于签名令牌的生产证书”,并且给出了在Azure上部署的示例。

我应该如何在IIS中创建密钥?您在这里做些什么? IIS Server Certificate

然后我该如何将正确的设置添加到appsettings.json中?

"IdentityServer": {
  "Key": {
    "Type": "Store",
    "StoreName": "My",
    "StoreLocation": "CurrentUser",
    "Name": "CN=MyApplication"
  }
}

我正在努力寻找网络上的指南或示例,任何帮助或指引都将不胜感激。


1
为解决”Exception Info: System.InvalidOperationException: Couldn't find a valid certificate with subject 'test' on the 'LocalMachine\Personal' ”错误,请点击开始按钮,打开并键入“Certmgr.msc”或“管理计算机证书”,并检查您的证书存储在哪个部分。 - Jalpa Panchal
所以这似乎向我展示了“证书 - 当前用户”,在其中我可以找到名为“test”的服务器证书,位于“受信任的根证书颁发机构”下面。 ... 然而,设置“类型:存储,存储名称:受信任的根证书颁发机构,存储位置:当前用户,名称:test”也不起作用...同样的错误。 :/ - marno11
4个回答

16

我还发现这份文档不够全面。我成功地将一个Angular应用程序部署到了Azure上。虽然我不确定它是否与部署到IIS相似,但也许这可以帮助您找到解决问题的方法。

部署到Azure:

首先,您需要将(自签名)证书(.pfx)上传到Azure应用服务中。我使用了这篇指南来创建自签名证书。

上传证书图片

您还需要通过在应用程序设置中添加指纹来使证书可用。见图像。

向应用服务添加证书指纹

别忘了更新您的appsettings.json文件,以便您的应用程序可以从前一步骤中访问证书。

"IdentityServer": {
  "Key": {
    "Type": "Store",
    "StoreName": "My",
    "StoreLocation": "CurrentUser",
    "Name": "CN=yourApp-domain.com"
  }
}
如果你遇到问题,请在应用服务中更改环境变量为"Development",以查看错误的详细信息。像这样。
更改环境变量

在我的情况下,由于我托管的 Identity API 是在子域名下,所以我必须设置 CN=*.domain.com。 - carraua

12

目前,我通过将证书导出到文件来解决这个问题。在 IIS 的“服务器证书”下,您可以右键单击证书并将其导出。

然后,您可以在 appsettings.json 中配置关键参数,以引用类似以下的文件:

"Key": {
  "Type": "File",
  "FilePath": "..\\test.pfx",
  "Password": "Test"
}

我仍然希望引用商店证书。


3
你在哪里找到这个配置部分的文档? - Dan
嗨,丹,我实际上不记得我在哪里找到这个...可能不是来自官方文档,我不记得它在任何时候都涵盖了这一点。但是看看我发现的这篇Reddit帖子,它更详细地概述了关键参数设置:https://www.reddit.com/r/aspnetcore/comments/bmq2n3/asp_net_core_3_angular_template_problem/ - marno11
只想说这太棒了!我一直在寻找这个。这应该出现在官方文档中的某个地方。或者也许有人知道类似于这样的库或程序集设置内省工具或方法的想法。 - Bangonkali

5

因此,这应该相对容易地配置开发目的。在 IIS 中,您可以发出自签名证书,该证书自然只在本地计算机上有效。

给它一些名称,如果您不更改任何其他内容并单击“确定”,它将默认将生成的证书存储在您的 Personal 存储中的 LocalMachine,因此下面的配置应该有效:

"IdentityServer": {
  "Key": {
    "Type": "Store",
    "StoreName": "Personal",
    "StoreLocation": "LocalMachine",
    "Name": "YourName"
  }
}

enter image description here

值得注意的是,如果您试图从其他地方导入证书,则必须至少具有2048位密钥,以用于Identity Server 4。

我曾经尝试过这个并收到了以下错误... 异常信息: System.InvalidOperationException: 无法在 'LocalMachine\Personal' 上找到具有主题“test”的有效证书 - marno11
我使用了“CN=MyPcName.local”作为值,这对我起作用了。通过Windows UI打开证书管理器,并仔细检查该证书是否实际位于个人文件夹下。 - Vidmantas Blazevicius
该死,仍然出现“异常信息:System.InvalidOperationException: 在'LocalMachine\Personal'上找不到具有主题'CN=<pcname>.local'的有效证书”,我还尝试了“CN=<pcname>”、“<pcname>.local”和“<pcname>”...这可能是无稽之谈,但我的PC名称中有一个破折号,这可能会导致问题。 - marno11
希望我没有让你困惑,那实际上是我的电脑名称,因为它是工作电脑。看起来IIS问题的主题名称与您当前的本地机器名称相同。你有那个异常的完整堆栈跟踪吗?它是开源的,所以我们可以检查一下发生了什么。 - Vidmantas Blazevicius
3
我能够使用上述建议,但需要将StoreName设置为"My"而不是"Personal",尽管我使用的证书存储在Personal中。如上评论所述,您还需要使用'CN=<pcname>'(.local不需要)。您还可以打开证书并查看主题,应该会显示CN=<pcname>。 - Bryan Euton
显示剩余4条评论

0
如果您还没有证书,请在Powershell中以管理员身份创建新证书:Administrator
New-SelfSignedCertificate -DnsName "blazortest" -CertStoreLocation "cert:\CurrentUser\My"

我随后使用 mmc.exe 导出证书为 .pfx 文件。

如果您在 IIS 上托管,您需要将 .pfx 证书导入到 本地计算机个人 文件夹中,然后选择 管理私钥... 并授权给运行 应用程序池 的用户。

enter image description here

从其他线程完整回答,包含 IdentityServerBuilderConfigurationExtensions 发布异常:

https://dev59.com/-FIG5IYBdhLWcg3wjxiN#66448397


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接