我创建了一个新的 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
然后我创建了一个这样的
.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 文档,我的证书应该有效:
用于签署令牌的生产证书。
如果我像这样加载密钥,它会起作用:
"Key": {
"Type": "Store",
"StoreName": "My",
"StoreLocation": "CurrentUser",
"Name": "CN=blazortest"
}
我能够通过删除 appsettings.Development.json.
中的 IdentityServer 条目来解决这个问题从 appsettings.Development.json 中删除以下行:
"IdentityServer": {
"Key": {
"Type": "Development"
}
}
尝试将证书上传到 Azure 应用服务 TLS/SSL 设置。 然后把
Type
改成“Store”,StoreName
改成“My”,StoreLocation
改成“CurrentUser”,Name
改成“CN=”.
然后重启应用服务。
对于我的版本,我在这些文章的帮助下创建了一个自签名证书:
这是我做的完整步骤(可能有一些更快的方法,但这是我做的原始步骤):
$cert = New-SelfSignedCertificate -Subject MyAppName
。 可以把MyAppName换成自己的,但是需要记住到流程结束$cert | Format-List -Property *
(不确定是否需要这个)Manage user certificates
中搜索了生成的证书。Trusted Root Certification > Certificates
文件夹。Copy To File..
选项卡中的Detail
变得可用,所以我做了。 (我将文件导出为 base64 Cer 文件)TLS/SSL Settings
.cer
选项卡中上传 Public Key Certificates (.cer)
文件,名称为 MyAppName
(与我在 powershell 命令中输入的内容相同 -Subject)appsettings.json
中,确保您具有以下设置:"IdentityServer": {
"Key": {
"Type": "Store",
"StoreName": "My",
"StoreLocation": "CurrentUser",
"Name": "CN=MyAppName"
}
}
对于使用通用提供程序托管的 Blazor,开发类型密钥可能仍会发出随每次程序重新启动而更改的签名密钥。
.PFX 文件不是通用托管的选项,因为身份服务器会尝试将私钥保存到 Windows 应用商店——这不是共享托管下的一个选项,也没有直接放入 Windows 应用商店并从那里检索的选项。
如果有数据库可用,密钥存储提供者Microsoft.AspNetCore.DataProtection.EntityFrameworkCore不难实现。按照 Entity Framework Core Key Storage 中的步骤与应用程序集成。