【问题标题】:Is Blazor app with Open ID Connect supported by Azure App Service Containers?Azure 应用服务容器是否支持具有 Open ID Connect 的 Blazor 应用?
【发布时间】:2020-09-23 23:24:11
【问题描述】:

问题 将 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 for containers 服务(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)。

【问题讨论】:

    标签: azure docker blazor asp.net-blazor


    【解决方案1】:

    你应该:

    • 为您的端点安装 HTTPS 证书并运行完整的端到端 HTTPS(推荐)
      要在 docker 上使用证书设置 kestrel,请阅读 this doc
    • 覆盖您的应用使用的 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();
        }
    }
    

    【讨论】:

    • 谢谢!赞赏!当我们尝试运行 e2e https 时,我们遇到了一个小问题——Web 应用程序不会为 docker 容器发布 https 端口,它发布了唯一的 http 端口,有什么办法可以克服这个问题吗? (https端口暴露在dockerfile中)
    • 您能否指出任何资源表明完整的端到端 HTTPS 是推荐的方法?我想了解更多有关利弊的信息。另外,我们如何处理证书 - 是否可以重用管理的应用服务,或者我必须创建一个新的?
    • 关于 Azure 证书管理我没有足够的技能
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-04
    • 2021-11-13
    • 1970-01-01
    相关资源
    最近更新 更多