0

问题 将 Blazor webassembly 应用程序部署为应用程序服务容器后,我们在浏览器中收到以下错误:

AuthenticationService.js:1 Mixed Content: The page at 'https://YYY.azurewebsites.net/authentication/login?returnUrl=https%3A%2F%2FYYY.azurewebsites.net%2Ffetchdata' was loaded over HTTPS, but requested an insecure XMLHttpRequest endpoint 'http://YYY.azurewebsites.net/.well-known/openid-configuration'. This request has been blocked; the content must be served over HTTPS.

想知道目前 Blazor 是否支持 docker 部署,如果支持,我们该如何解决?

重新制作的步骤: 1. 在 VS 2019 专业预览版 16.7.0 预览版 2.0 中:使用托管选项创建 Blazor 应用程序(标准“Blazor WebAssembly 应用程序”模板)并使用 Identity Server 进行应用内身份验证 2. 部署 linux docker 容器到容器服务的 Azure Web App (B1) 3. 应用服务的 HTTPS Only 设置为 ON

为此,我们使用了以下简单的 docker 文件:

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1 AS runtime
WORKDIR /app
EXPOSE 80
COPY . .
ENTRYPOINT ["dotnet", "AppNameHere.Server.dll"]

不知何故,Blazor 使用的 OIDC JS 库没有发现我们在 HTTPS 上运行的事实(尽管在容器实例和应用服务负载均衡器之间使用了 HTTP)。

4

1 回答 1

1

您应该:

  • 为您的端点安装 HTTPS 证书并运行完整的端到端 HTTPS(推荐)
    要在 docker 上使用证书设置 kestrel,请阅读此文档
  • 覆盖您的应用使用的 OIDC 配置:

创建一个 metadata.json 文件

{
    "issuer": "http://YYY.azurewebsites.net",
    "jwks_uri": "https://YYY.azurewebsites.net/.well-known/openid-configuration/jwks",
    "authorization_endpoint": "https://YYY.azurewebsites.net/connect/authorize",
    "token_endpoint": "https://YYY.azurewebsites.net/connect/token",
    "userinfo_endpoint": "https://YYY.azurewebsites.net/connect/userinfo",
    "end_session_endpoint": "https://YYY.azurewebsites.net/connect/endsession",
    "check_session_iframe": "https://YYY.azurewebsites.net/connect/checksession"
}

"issuer": " http://YYY.azurewebsites.net " 是 HTTP url 而不是 HTTPS

配置应用程序以从您的自定义文件中获取元数据

public class Program
{
    public static async Task Main(string[] args)
    {
        var builder = WebAssemblyHostBuilder.CreateDefault(args);
        builder.RootComponents.Add<App>("app");
        builder.Services.AddOidcAuthentication<RemoteAuthenticationState, RemoteUserAccount>(options =>
                {
                    var providerOptions = options.ProviderOptions;
                    providerOptions.Authority = "https://YYY.azurewebsites.net";
                    providerOptions.MetadataUrl = "https://YYY.azurewebsites.net/metadata.json";
                    providerOptions.PostLogoutRedirectUri = "https://YYY.azurewebsites.net/authentication/logout-callback";
                    providerOptions.RedirectUri = "https://YYY.azurewebsites.net/login-callback";
                });
        await builder.Build().RunAsync();
    }
}
于 2020-06-05T07:38:22.793 回答