3

问题摘要


设置

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 托管应用程序,并在服务器上对其进行了测试。一切正常,包括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 ]
  • 主布局已加载。我可以看到侧边栏和导航菜单。单击侧边栏链接会更改地址栏中的 url,但不会发生路由
  • 导航菜单仅显示“关于”导航链接。(缺少“登录”和“注册”)

如果这是一个非常基本的错误的结果,我不会感到惊讶,但如果我有一些与我正在尝试做的事情不兼容的关键部分,我也不会感到惊讶。我只是在学习,所以请不要以为我已经完成了所有显而易见的事情。对我来说可能不是那么明显。



进步

从下面评论中Pavel Voronin提供的链接中,我找到了解决最初问题的解决方案:

来自Github 问题

在我的情况下,即使我启动了服务器项目,错误也出现了。我的身份服务器未安装在我的应用程序所在的同一台服务器上。

所以,我在 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 中的端口代理设置(除非我缺少压缩设置或类似的设置)

我很确定这与配置身份服务器有关。

4

2 回答 2

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);
    }
}
于 2020-07-28T03:24:45.233 回答
1

appsettings.json 中的 IdentityServer 配置应类似于以下内容

  "IdentityServer": {
    "Clients": {
      "MyProject.Client": {
        "Profile": "IdentityServerSPA"
      }
    },
    "Key": {
      "Type": "Store",
      "StoreName": "My",
      "StoreLocation": "CurrentUser",
      "Name": "CN=my-project"
    }
  },

因此 OidcConfigurationController 将能够找到您的客户端 ID。

于 2020-08-11T18:52:12.813 回答