问题摘要
设置
Boilerplate Blazor 使用以下身份验证托管 wasm 应用程序:dotnet new blazorwasm -ho -au Individual -o TestApp
我将默认数据库更改为使用 MySql
我在我的开发机器上运行应用程序并测试我可以创建用户、登录等。在我的开发环境中一切正常。
部署站点加载后,但在主体顶部显示“正在授权”,并在浏览器底部抛出“发生未处理错误”消息以及浏览器控制台中的错误消息,如下所示
部署
服务器环境
Raspberry Pi4(8gb) 运行 Ubuntu Server 20.04 (64bit) 和 Apache2
部署方式
将更改推送到 Github 后,我在我的服务器上执行获取和拉取远程仓库
然后我确保项目构建并发布到/var/www/[MyWebAddress]/TestApp
使用:dotnet publish -o /var/www/[my web address]/TestApp --no-self-contained -r linux-x64
我直接从Microsoft docs复制了我的 apache 站点 conf 文件([我的网址].conf):
<VirtualHost *:80>
ServerName www.[my web address]
ServerAlias *.[my web address]
DocumentRoot "/var/www/[my web address]/TestApp"
ErrorDocument 404 /wwwroot/index.html
AddType application/wasm .wasm
AddType application/octet-stream .dll
<Directory "/var/www/[my web address]/TestApp">
Options -Indexes
AllowOverride None
</Directory>
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE application/octet-stream
AddOutputFilterByType DEFLATE application/wasm
<IfModule mod_setenvif.c>
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4.0[678] no-gzip
BrowserMatch bMSIE !no-gzip !gzip-only-text/html
</IfModule>
故障排除见解
在尝试此设置之前,我进行了相同的部署,但没有使用身份验证或数据库连接。我刚刚使用上述相同的方法部署了一个样板的 Blazorwasm 托管应用程序,并在服务器上对其进行了测试。一切正常,包括FetchData
和Counter
页面。这使我非常确定我的部署方法有效,并且与导致问题的 IdentityServer 有关。
为了测试这一点,我正在使用连接到手机提供的无线热点的笔记本电脑。这允许我从外部网络访问我的本地服务器(只需使用禁用 wifi 的手机即可,但我无法在移动设备上打开浏览器工具进行故障排除)。我从不同的浏览器得到的错误略有不同,但它们与 Firefox 产生的错误相似:
Error: "Failed to start platform. Reason: AbortError: The operation was aborted. "
v https://[my web address]/ framework/blazor.webassembly.js:1
u https://[my web address]/ framework/blazor.webassembly.js:1
u https://[my web address]/ framework/blazor.webassembly.js:1
u https://[my web address]/ framework/blazor.webassembly.js:1
AbortError: The operation was aborted.
crit: Microsoft.AspNetCore.Components.WebAssembly.REnderingWebAssemblyREenderer[100]
Unhandled exception rendering component: Could not load settings form '_configuration/TestSite.Client'
createUserManager@https://[my web address]/ content/Microsoft.AspNetCore.Components.WebAssembly.Authentication/AuthenticationService.js:1:5893
[ continued error messages omitted ]
- 主布局已加载。我可以看到侧边栏和导航菜单。单击侧边栏链接会更改地址栏中的 url,但不会发生路由
- 导航菜单仅显示“关于”导航链接。(缺少“登录”和“注册”)
如果这是一个非常基本的错误的结果,我不会感到惊讶,但如果我有一些与我正在尝试做的事情不兼容的关键部分,我也不会感到惊讶。我只是在学习,所以请不要以为我已经完成了所有显而易见的事情。对我来说可能不是那么明显。
进步
从下面评论中Pavel Voronin提供的链接中,我找到了解决最初问题的解决方案:
在我的情况下,即使我启动了服务器项目,错误也出现了。我的身份服务器未安装在我的应用程序所在的同一台服务器上。
所以,我在 Program.cs(客户端)中做了一些更改
public static async Task Main(string[] args) { var builder = WebAssemblyHostBuilder.CreateDefault(args); builder.RootComponents.Add<App>("app"); builder.Services.AddHttpClient("BlazorApp1.ServerAPI", client => client.BaseAddress = new Uri(builder.HostEnvironment.BaseAddress)) .AddHttpMessageHandler<BaseAddressAuthorizationMessageHandler>(); builder.Services.AddTransient(sp => sp.GetRequiredService<IHttpClientFactory>() CreateClient("BlazorApp1.ServerAPI")); //The following line has been disabled //builder.Services.AddApiAuthorization(); //In order to authenticate to IS4: builder.Services.AddOidcAuthentication(options => { builder.Configuration.Bind("Local", options.ProviderOptions); }); await builder.Build().RunAsync(); }
appsettings.json
我还使用权威和 ClientId配置 OpenId 设置。更改后,错误消失了。不确定这是否是解决此错误的方法。
对程序文件进行更改后,页面按预期加载,没有错误
但是当我点击“注册”链接时,在重定向回索引页面之前会出现一条简短的“不支持注册”消息
在多打探之后,我不相信这是一个解决方案,我正在回滚
从上面引用的示例中:
我的身份服务器未安装在我的应用程序所在的同一台服务器上。
这导致他使用OIDC
而不是ApiAuthentication
. 这不是我的情况,因为我的身份验证存在于 Blazor 服务器应用程序上,该应用程序是 Blazor“托管”模板的一部分,该模板基本上充当项目的 api
我在部署工作流程描述中没有包括的一件事是,在从 GitHub 拉取并在服务器存储库中构建项目之后,在发布之前,我迁移和更新了服务器上的数据库。我已验证数据库已创建并且所有 Auth 表都存在于服务器 db 上
我也有一个理论,它是使用服务器上的 IIS 设置启动的。我在开发中进行的测试使用的是 Kestrel。我使用 IIS 从 Visual Studio 启动,并得到一些与我从服务器看到的类似的错误。所以我从这两个文件中删除了所有 IIS 配置launchsettings.json
并重新发布。行为没有变化
我认为我已经缩小了范围
- 数据库连接和配置,包括连接字符串
- apache2 中的端口代理设置(除非我缺少压缩设置或类似的设置)
我很确定这与配置身份服务器有关。