Blazor - app.UseIdentityServer();使用 .pfx 密钥文件 - 解析数字时遇到意外字符

问题描述 投票:0回答:3

我创建了一个新的 Blazor WebAssembly 应用程序,其中包含个人用户帐户、在应用程序中存储用户帐户和托管在 .NET 5 中的 ASP.NET Core。将我的应用程序部署到 Azure 应用程序服务时,出现以下错误:

对象引用未设置为对象的实例.at Microsoft.Extensions.DependencyInjection.IdentityServerBuilderConfigurationExtensions

阅读这些链接,我必须为 IdentityServer 提供我自己的生产证书:

Blazor Web Assembly App .Net Core Hosted:发布运行时错误

https://stackoverflow.com/a/56904000/3850405

https://learn.microsoft.com/en-us/aspnet/core/security/authentication/identity-api-authorization?view=aspnetcore-5.0#example-deploy-to-azure-app-service

然后我创建了一个这样的

.pfx
文件,我已经验证它可以工作并且我的密码是正确的。

https://stackoverflow.com/a/48790088/3850405

然后我将

.pfx
文件放在我的
Server
项目根文件夹中,并将
Copy to Output Directory
标记为
Copy Always
.

然后我更新了

appsettings.json
看起来像这样:

  "IdentityServer": {
    "Clients": {
      "BlazorTest.Client": {
        "Profile": "IdentityServerSPA"
      }
    },
    "Key": {
      "Type": "File",
      "FilePath": "localhost.pfx",
      "Password": "MySercurePassword123?"
    }
  },

现在该项目在本地和 Azure 上都无法运行。它在

app.UseIdentityServer();
中的
Startup.cs
上失败,并出现以下错误:

Newtonsoft.Json.JsonReaderException: '遇到意外字符 在解析数字时:�。路径 '',第 1 行,位置 1。'

根据 Microsoft 文档,我的证书应该有效:

用于签署令牌的生产证书。

  • 这个证书没有具体要求;它可以是自签名证书或通过 CA 机构提供的证书。
  • 可以通过 PowerShell 或 OpenSSL 等标准工具生成。
  • 它可以安装到目标机器上的证书存储区或部署为具有强密码的 .pfx 文件。

https://learn.microsoft.com/en-us/aspnet/core/security/authentication/identity-api-authorization?view=aspnetcore-5.0#deploy-to-production

如果我像这样加载密钥,它会起作用:

"Key": {
  "Type": "Store",
  "StoreName": "My",
  "StoreLocation": "CurrentUser",
  "Name": "CN=blazortest"
}
c# azure blazor identityserver4 blazor-webassembly
3个回答
2
投票

我能够通过删除 appsettings.Development.json.

中的 IdentityServer 条目来解决这个问题

从 appsettings.Development.json 中删除以下行:

"IdentityServer": {
     "Key": {
       "Type": "Development"
     }
   } 

0
投票

尝试将证书上传到 Azure 应用服务 TLS/SSL 设置。 然后把

Type
改成“Store”,
StoreName
改成“My”,
StoreLocation
改成“CurrentUser”,
Name
改成“CN=”.

然后重启应用服务。

对于我的版本,我在这些文章的帮助下创建了一个自签名证书:

这是我做的完整步骤(可能有一些更快的方法,但这是我做的原始步骤):

  1. 打开 Powershell(以管理员身份)
  2. 执行
    $cert = New-SelfSignedCertificate -Subject MyAppName
    可以把MyAppName换成自己的,但是需要记住到流程结束
  3. 执行命令
    $cert | Format-List -Property *
    (不确定是否需要这个)
  4. 我在
    Manage user certificates
    中搜索了生成的证书。
  5. 原来我不能把它导出到文件,因为它不受信任所以我把它移到了
    Trusted Root Certification > Certificates
    文件夹。
  6. 然后当我打开证书时,
    Copy To File..
    选项卡中的
    Detail
    变得可用,所以我做了。 (我将文件导出为 base64 Cer 文件)
  7. 我通过 Azure 门户打开应用服务资源。
  8. 导航到
    TLS/SSL Settings
  9. .cer
    选项卡中上传
    Public Key Certificates (.cer)
    文件,名称为
    MyAppName
    (与我在 powershell 命令中输入的内容相同 -Subject)
  10. 在您的应用程序的
    appsettings.json
    中,确保您具有以下设置:
"IdentityServer": {
  "Key": {
    "Type": "Store",
    "StoreName": "My",
    "StoreLocation": "CurrentUser",
    "Name": "CN=MyAppName"
  }
}
  1. 最后,我重新启动了App Service。

0
投票

对于使用通用提供程序托管的 Blazor,开发类型密钥可能仍会发出随每次程序重新启动而更改的签名密钥。

.PFX 文件不是通用托管的选项,因为身份服务器会尝试将私钥保存到 Windows 应用商店——这不是共享托管下的一个选项,也没有直接放入 Windows 应用商店并从那里检索的选项。

如果有数据库可用,密钥存储提供者Microsoft.AspNetCore.DataProtection.EntityFrameworkCore不难实现。按照 Entity Framework Core Key Storage 中的步骤与应用程序集成。

© www.soinside.com 2019 - 2024. All rights reserved.