Boilerplate Blazor托管的wasm应用程序具有使用dotnet new blazorwasm -ho -au Individual -o TestApp
我将默认数据库更改为使用MySql
我在开发计算机上运行了应用程序,并测试了可以创建用户,登录等的功能。在开发环境中一切正常。
部署网站负载后,但在主体顶部显示“正在授权”,并在浏览器底部显示“发生未处理的错误”消息,并在浏览器控制台中显示错误消息,如下所示>
在Apache2上运行Ubuntu Server 20.04(64位)的Raspberry Pi4(8gb)
将更改推送到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 ]
如果这是一个非常基本的错误,我一点也不惊讶,但是如果我有一些与我尝试做的事情不兼容的关键文章,我也不会感到惊讶。 。我只是在学习,所以请不要以为我已经完成了所有显而易见的工作。对我来说可能不是那么明显。
在下面的评论中,从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
中配置OpenId设置: 授权和ClientId。更改之后,错误消失了。不确定是否可以解决此错误。
对Program文件进行更改后,页面将按预期加载,没有错误
但是,当我单击“注册”链接时,在重定向回索引页面之前,会显示一则简短的“不支持注册”消息
经过一番摸索,我不认为这是一个解决方案,我会回滚它
来自上面引用的示例:
我的身份服务器未安装在我的应用所在的同一服务器上。
这导致他使用OIDC
而不是ApiAuthentication
。对于我而言,情况并非如此,因为我的身份验证存在于Blazor服务器应用程序中,该应用程序是Blazor“托管”模板的一部分,该模板实际上充当了项目的api
我对部署工作流程的描述中没有包括的一件事是,在发布之前,我从GitHub提取并在服务器存储库中构建了项目之后,便在服务器上迁移和更新了数据库。我已经验证数据库已创建并且所有Auth表都存在于服务器数据库中
我也有一种理论认为它是使用服务器上的IIS设置启动的。我在开发中所做的测试是使用Kestrel。我使用IIS从Visual Studio启动,并遇到了一些与从服务器看到的类似的错误。因此,我从两个launchsettings.json
文件中删除了所有IIS配置,然后重新发布。行为没有改变
我很确定这与配置Identity Server有关。
答案 0 :(得分:2)
AddOidcAuthentication调用OidcConfigurationController管理身份验证任务,此控制器使用AuthenticationService.js 您需要设置控制器以允许匿名请求正常工作
[AllowAnonymous]
public class OidcConfigurationController : Controller
{
private readonly ILogger<OidcConfigurationController> _logger;
public OidcConfigurationController(IClientRequestParametersProvider clientRequestParametersProvider, ILogger<OidcConfigurationController> logger)
{
ClientRequestParametersProvider = clientRequestParametersProvider;
_logger = logger;
}
public IClientRequestParametersProvider ClientRequestParametersProvider { get; }
[HttpGet("_configuration/{clientId}")]
public IActionResult GetClientRequestParameters([FromRoute] string clientId)
{
var parameters = ClientRequestParametersProvider.GetClientParameters(HttpContext, clientId);
return Ok(parameters);
}
}
答案 1 :(得分:1)
appsettings.json中的IdentityServer配置应类似于以下内容
"IdentityServer": {
"Clients": {
"MyProject.Client": {
"Profile": "IdentityServerSPA"
}
},
"Key": {
"Type": "Store",
"StoreName": "My",
"StoreLocation": "CurrentUser",
"Name": "CN=my-project"
}
},
因此OidcConfigurationController将能够找到您的客户端ID。