我已经创建了一个新的Blazor WebAssembly应用程序与个人用户帐户,存储用户帐户在应用程序和ASP。.NET Core托管在。NET 5。当将我的应用程序部署到Azure应用程序服务时,我得到以下错误:
对象引用未设置为Object .at的实例Microsoft.Extensions.DependencyInjection.IdentityServerBuilderConfigurationExtensions
阅读这些链接,我必须在IdentityServer的生产中提供我自己的证书:
Blazor Web Assembly App .Net Core hosting: publish runtime error
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上工作。在Startup.cs
的app.UseIdentityServer();
上失败,出现以下错误:
Newtonsoft.Json。JsonReaderException: '遇到意外字符解析number时:路径",第一行,位置1
根据微软文档我的证书应该是有效的:
用于签名令牌的生产证书。
- 本证书无具体要求;可以是自签名证书,也可以是通过CA机构提供的证书。
- 可以通过PowerShell或OpenSSL等标准工具生成。
- 它可以安装到目标机器上的证书存储中,或者作为带有强密码的.pfx文件部署。
https://learn.microsoft.com/en us/aspnet/core/security/authentication/identity - api - authorization?view=aspnetcore - 5.0 #部署到生产
如果我像这样加载键,它可以工作:
"Key": {
"Type": "Store",
"StoreName": "My",
"StoreLocation": "CurrentUser",
"Name": "CN=blazortest"
}
我能够通过删除appsettings.Development.json中的IdentityServer条目来解决此问题。Development. json:
"IdentityServer": {
"Key": {
"Type": "Development"
}
}
尝试将证书上传到Azure应用程序服务TLS/SSL设置中。然后将Type
改为"Store",StoreName
改为"My",StoreLocation
改为"CurrentUser"并将Name
转换为"CN="
然后重启app服务。
对于我的版本,我在这些文章的帮助下创建了一个自签名证书:
- 步骤1~6:New-SelfSignedCertificate.
- 步骤7~11:部署到App Service
这是我所做的完整步骤(可能有一些更快的方法,但这是我所做的原始步骤):
- 打开Powershell(作为Admin)
- 执行
$cert = New-SelfSignedCertificate -Subject MyAppName
。你可以用你自己的MyAppName替换它,但是你需要记住它直到进程结束 - 执行命令
$cert | Format-List -Property *
(不确定是否需要) - 我在
Manage user certificates
中搜索生成的证书。 - 事实证明,我不能导出它的文件,因为它是不受信任的,所以我把它移动到
Trusted Root Certification > Certificates
文件夹。 - 然后当我打开证书时,
Detail
选项卡中的Copy To File..
变得可用,所以我这样做了。(我导出文件为base64 Cer文件) - 我通过Azure门户打开应用服务资源
- 导航到
TLS/SSL Settings
- 在
Public Key Certificates (.cer)
选项卡中上传.cer
文件,名称为MyAppName
(与我在powershell命令-Subject中输入的名称相同) 在你的应用程序的
appsettings.json
,确保你有以下设置:"IdentityServer": {
"Key": {
"Type": "Store",
"StoreName": "My",
"StoreLocation": "CurrentUser",
"Name": "CN=MyAppName"
}
}
- 最后,我重新启动了App Service。
对于具有通用提供商的Blazor托管,开发类型密钥可能仍然会发出签名密钥,随着每次程序重新启动而更改。
. pfx文件不是通用主机的选项,因为身份服务器试图将私钥持久化到Windows Store中,而不是共享主机的选项,也不是直接放入Windows Store并从中检索的选项。
如果有可用的数据库,密钥存储提供者Microsoft.AspNetCore.DataProtection.EntityFrameworkCore并不难实现。按照实体框架核心密钥存储中的步骤与应用程序集成。