Blazor wasm托管“无法从configuration / TestApp.Client-(AuthenticationService.js)加载设置

时间:2020-06-26 06:05:38

标签: authorization identityserver4 blazor blazor-webassembly webassembly

问题摘要


设置

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]/TestAppdotnet 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托管应用程序,并在服务器上对其进行了测试。一切正常,包括FetchDataCounter页面。这使我非常确定我的部署方法有效,并且与导致问题的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提供的链接中,我找到了解决最初问题的解决方案:

来自Github issues

就我而言,即使我启动服务器项目,也会出现错误。 我的身份服务器未安装在我的应用所在的同一服务器上 找到。

因此,我在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配置,然后重新发布。行为没有改变


我认为的 是什么

  • 数据库连接和配置,包括连接字符串
  • apache2中的端口代理设置(除非有压缩设置或我缺少的类似设置)

我很确定这与配置Identity Server有关。

2 个答案:

答案 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。