0

我在使用基于路径的路由将我的 Open Auth ID .net Core 2 应用程序配置为 Web 应用程序防火墙后面的应用程序服务时遇到问题。

我的应用程序是 myapp.azurewebsites.net,其网络限制使其无法从公共 Internet 访问。我在同一个 VNET 中部署了 WAF,并允许使用基于路径的路由“/Admin*”在 WAF 和应用服务之间进行流量。

效果是https://myapp.azurewebsites.net无法通过 Internet 访问,但https://myWAF/Admin可以访问并映射到应用服务。

此设置工作正常,但是当我将 Open ID auth 引入我的 .net 核心应用程序时,传出 Location 标头包含其 myapp.azurewebsites.net/signin-oidc 作为回复 URI。

这不起作用,因为无法从 Internet 访问主机。我尝试了几种方法;

  • 我在 Azure App Registrations 的应用程序注册 URL 中添加了 WAF URL ( https://myWAF/Admin/signin-oidc ),以允许 AAD 接受修改后的 URL(作为合法的
  • 我在我的 startup.cs 中编写了 app.UseForwardedHeaders (强制重用所有 X-Forwarded 标头)。这似乎对我的应用服务发送的 Location 标头没有任何影响。我认为 WAF 正在发送 X-Forwarded 标头,但如果是,则 Open Auth ID 堆栈没有使用它们。
  • 我在 WAF 中编写了一个标头重写代码,以将 myapp.azurewebsites.net 替换为 WAF URL。这确实会正确替换 URL 并允许回调,但随后会因关联错误而失败(这似乎是一个通用的 Open ID 堆栈错误,意思是“随机数不匹配”。随机数可能基于被调用的 URL回到 - 在我的情况下,由于 WAF 重定向而发生变化,但这是一个猜测)。

在我看来,我应该能够在我的应用程序中使用 X-Forwarded 标头来解决在 WAF 中对标头重写进行编码的需要,但是我找不到成功使用它来更改的示例Open ID 发出的回复 URI。

我的问题;使用 X-Forwarded 标头是在 OAuth 上下文中处理代理的正确方法,还是在 WAF 中重写标头是正确的方法?

我已经设定

4

1 回答 1

0

经过大量调查,我发现了以下内容;

  1. WAF 不会将标准的 X-Forwarded-Host 发送到 App Services,而是发送 X-Original-Host。记录在这里https://feedback.azure.com/forums/217313-networking/suggestions/33657763-add-the-x-forwarded-host-header-to-application-gat
  2. ASP.net Core 2 在其 ForwardedHeaders 中间件中使用的 ForwardedHeaderOptions 有一个选项,可以用任意其他主机头名称替换预期和支持的“X-Forwarded-Host”。可以按如下方式触发此行为,以将 x-Forwarded-Host 的使用替换为 WAF 特定的 X-Original-Host。

    options.ForwardedHostHeaderName = "X-ORIGINAL-HOST";

  3. WAF 不会按照 PathBase 标头中的预期将基于路径的路由的路径向下传递到 Http 标头堆栈。这必须通过 Header Rewrite 在 WAF 中或在应用程序中添加到请求标头中,如下所示(在这种情况下,应用程序路径路由是 /Admin);

    app.Use((context, next) => { context.Request.PathBase = new PathString("/Admin"); return next(); });

于 2019-10-30T14:30:27.720 回答