1

我有一个在部署到 Azure 应用服务的 Tomcat 上运行的 Java webapp。身份验证通过 Azure AD 处理。在本地环境中,一切似乎都运行良好。

当我们将应用程序部署到 Azure 时,无论调用是否来自 HTTPS 端点,httpRequest.getScheme() 始终返回 HTTP。

因此,重定向 URL 是使用 HTTP 终结点构造的,并且与 Azure AD 应用注册中指定的重定向 URL 不匹配。redirectUrl 的构造如下。

String currentUri = httpRequest.getRequestURL().toString(); String redirectUrl = authority + tenant + "/oauth2/authorize? response_type=code&scope=user.read.all&response_mode=form_post&redirect_uri=" + URLEncoder.encode(currentUri, "UTF-8") + "&client_id=" + clientId + "&resource=https%3a%2f%2fgraph.microsoft.com" + "&state=" + state + "&nonce=" + nonce;

我已经搜索并找到了这个 - https://creechy.wordpress.com/2011/08/22/ssl-termination-load-balancers-java/。负载均衡器可能会导致此类问题,我们需要修改 Tomcat配置。

如果我们在本地服务器上部署 WAR 文件,应用程序可以正常工作。问题仅出现在 Azure 中。

redirectUrl 始终包含http://xxxxx.azurewebsites.net,但在应用注册中,redirectUrl 指定为https://xxxx.azurewebsites.net

有没有其他人遇到过这个问题?如何避免这种情况?

4

1 回答 1

0

我对此做了一些研究。在 Azure Web 应用程序中,它将始终使用 http 作为协议。您可以从请求标头中获取真正的协议。

String currentUri = httpRequest.getRequestURL().toString();
String realProto=httpRequest.getHeader("x-forwarded-proto");
if(realProto!=null)     currentUri=currentUri.replaceFirst("http",realProto);
于 2019-11-12T03:31:55.483 回答